【Protocol Buffer】Protocol Buffer入门教程(四):序列化和反序列化
生活随笔
收集整理的這篇文章主要介紹了
【Protocol Buffer】Protocol Buffer入门教程(四):序列化和反序列化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 數組的序列化和反序列化
- 02. 字符串序列化和反序列化
- 03. 文件描述符序列化和反序列化
- 04. C++ Stream序列化和反序列化
- 05. 附錄
01. 數組的序列化和反序列化
參考代碼
#include "addressbook.pb.h" #include <iostream> using namespace std;/* //C數組的序列化和序列化API //在/usr/local/include/google/目錄下,查找包含"SerializeToArray"所有的文件,同時打印所在行 //sudo grep "SerializeToArray" -r /usr/local/include/google/ -nbool SerializeToArray(void* data, int size) const; //序列化 bool ParseFromArray(const void* data, int size); //反序列化 */ char buf[1024]; int len;void set_person() {Person obj;obj.set_name("itcast");obj.set_id(88);*obj.mutable_email() = "itcast@qq.com"; //obj.set_email("itcast@qq.com");len = obj.ByteSize(); //獲取長度cout << "len = " << len << endl;obj.SerializeToArray(buf, len);//序列化,obj成員保存在buf中 }void get_person() {Person obj;obj.ParseFromArray(buf, len); //反序列化,buf的內容設置給obj的成員cout << "name = " << obj.name() << endl;cout << "id = " << obj.id() << endl;cout << "email = " << obj.email() << endl; }int main() {// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_person(); //序列化get_person(); //反序列化// Optional: Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0; }編譯和執行結果
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ls addressbook.pb.cc addressbook.pb.h addressbook.proto a.out test.cpp deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++ test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf` deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out len = 25 name = itcast id = 88 email = itcast@qq.com deng@itcast:/mnt/hgfs/LinuxHome/day03$02. 字符串序列化和反序列化
參考代碼
#include "addressbook.pb.h" #include <iostream> using namespace std;//bool SerializeToString(string* output) const; //bool ParseFromString(const string& data); string str; //全局變量void set_person() {Person obj;obj.set_name("itcast");obj.set_id(88);obj.set_email("itcast@qq.com");//*obj.mutable_email() = "itcast@qq.com";obj.SerializeToString(&str); //序列化,obj成員的內容設置給str }void get_person() {Person obj;obj.ParseFromString(str); //反序列化, str內容設置給obj的成員cout << "name = " << obj.name() << endl;cout << "id = " << obj.id() << endl;cout << "email = " << *obj.mutable_email() << endl; }int main() {// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_person(); //序列化get_person(); //反序列化// Optional: Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0; }編譯和執行結果
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ls addressbook.pb.cc addressbook.proto test01.cpp addressbook.pb.h a.out test.cpp deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++ test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf` deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out name = itcast id = 88 email = itcast@qq.com deng@itcast:/mnt/hgfs/LinuxHome/day03$03. 文件描述符序列化和反序列化
參考代碼
#include "addressbook.pb.h" #include <iostream>#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>using namespace std;//bool SerializeToFileDescriptor(int file_descriptor) const; //bool ParseFromFileDescriptor(int file_descriptor); void set_person() {Person obj;obj.set_name("itcast");obj.set_id(1);obj.set_email("itcast@qq.com");//*obj.mutable_email() = "itcast@qq.com";//O_CREAT: 新建文件, O_TRUNC:清空文件,O_RDWR:讀寫int fd = open("./pb.itcast", O_CREAT | O_TRUNC | O_RDWR, 0644);if (fd <= 0){perror("open");exit(0);}obj.SerializeToFileDescriptor(fd); //序列化,obj成員的內容寫入fd所關聯的文件中close(fd); //關閉文件 }void get_person() {int fd = open("./pb.itcast", O_RDONLY); //O_RDONLY: 只讀方式if (fd <= 0){perror("open");exit(0);}Person obj;obj.ParseFromFileDescriptor(fd); //反序列化, fd文件內容設置給obj的成員close(fd); //關閉文件cout << "name = " << obj.name() << endl;cout << "id = " << obj.id() << endl;cout << "email = " << *obj.mutable_email() << endl; }int main() {// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_person(); //序列化get_person(); //反序列化// Optional: Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0; }編譯和執行結果
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ls addressbook.pb.cc addressbook.proto pb.itcast test02.cpp addressbook.pb.h a.out test01.cpp test.cpp deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++ test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf` deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out name = itcast id = 1 email = itcast@qq.com deng@itcast:/mnt/hgfs/LinuxHome/day03$04. C++ Stream序列化和反序列化
參考代碼
#include "addressbook.pb.h" #include <iostream> #include <fstream>using namespace std;//bool SerializeToOstream(ostream* output) const; //bool ParseFromIstream(istream* input); void set_person() {Person obj;obj.set_name("itcast");obj.set_id(1);obj.set_email("itcast@qq.com");//*obj.mutable_email() = "itcast@qq.com";fstream output("pb.itcast", ios::out | ios::trunc | ios::binary);bool flag = obj.SerializeToOstream(&output);//序列化if (!flag){cerr << "Failed to write file." << endl;return;}output.close();//關閉文件 }void get_person() {Person obj;fstream input("./pb.itcast", ios::in | ios::binary);obj.ParseFromIstream(&input); //反序列化input.close(); //關閉文件cout << "name = " << obj.name() << endl;cout << "id = " << obj.id() << endl;cout << "email = " << *obj.mutable_email() << endl; }int main() {// Verify that the version of the library that we linked against is// compatible with the version of the headers we compiled against.GOOGLE_PROTOBUF_VERIFY_VERSION;set_person(); //序列化get_person(); //反序列化// Optional: Delete all global objects allocated by libprotobuf.google::protobuf::ShutdownProtobufLibrary();return 0; }編譯和執行結果
deng@itcast:/mnt/hgfs/LinuxHome/day03$ ls addressbook.pb.cc addressbook.proto pb.itcast test02.cpp test.cpp addressbook.pb.h a.out test01.cpp test03.cpp deng@itcast:/mnt/hgfs/LinuxHome/day03$ g++ test.cpp addressbook.pb.cc `pkg-config --libs --cflags protobuf` deng@itcast:/mnt/hgfs/LinuxHome/day03$ ./a.out name = itcast id = 1 email = itcast@qq.com deng@itcast:/mnt/hgfs/LinuxHome/day03$05. 附錄
參考博客:https://blog.csdn.net/sealyao/article/details/6940245
測試代碼下載:測試代碼
總結
以上是生活随笔為你收集整理的【Protocol Buffer】Protocol Buffer入门教程(四):序列化和反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Protocol Buffer】Pro
- 下一篇: 【Linux】一步一步学Linux——a