protobuf 序列化 反序列介面
阿新 • • 發佈:2019-02-06
包括 C陣列序列化與反序列化 ,檔案描述符序列化與發序列化 ,string類的序列化與反序列化 ,C++ stream 序列化和反序列化
你也可以在/usr/local/include/google/目錄下,查詢包含"SerializeToArray"所有的檔案,同時列印所在行
grep "SerializeToArray" -r /usr/local/include/google/ -n 來查詢 你要的介面 改變關鍵字就可以
下面我們來使用一個稍微複雜的例子 來使用protobuf的介面C陣列序列化和反序列化介面 bool SerializeToArray(void* data, int size) const; //序列化 bool ParseFromArray(const void* data, int size); //反序列化 檔案描述符序列化與發序列化 bool SerializeToFileDescriptor(int file_descriptor) const; //序列化 bool ParseFromFileDescriptor(int file_descriptor); //反序列化 string類的序列化與反序列化 bool SerializeToString(string* output) const; //序列化 bool ParseFromString(const string& data); //反序列化 C++ stream 序列化和反序列化 bool SerializeToOstream(ostream* output) const;//序列化 bool ParseFromIstream(istream* input); //反序列化
//msg.proto package demo; message data_t { required int32 data_int_info = 1; required string name = 2; } message kv_t { required int32 key = 1; required string value = 2; } message msg { required int32 int_info = 1; required string string_info = 2; required data_t data_info = 3; optional string opt_info = 4; //can select repeated kv_t vector_info = 5; }
//protobuf_demo.cc #include"msg.pb.h" #include<iostream> #include<string> using namespace std; int main(int argc,char *argv[]) { demo::msg writer; writer.set_int_info(1); writer.set_string_info("i am wk"); demo::data_t* data1 = writer.mutable_data_info(); data1->set_data_int_info(2); data1->set_name("wk"); for (int i=0;i<5;++i) { demo::kv_t* data2 = writer.add_vector_info(); data2->set_key(i); data2->set_value("hello"); } //C++string序列化和序列化API //客戶端格式化資訊 string in_data; writer.SerializeToString(&in_data); //下面用一個臨時的string 表示在網路中進行傳輸的過程 //真是的過程中你可以藉助相應的網路框架對資料進行傳輸 //客戶端將資料放到網路上 string tmp=in_data; //模擬服務端從網路上拿資料 string out_data=tmp; //服務端反格式化資訊 demo::msg reader; reader.ParseFromString(out_data); cout<<"int_info: "<<reader.int_info()<<endl; cout<<"string_info: "<<reader.string_info()<<endl; demo::data_t * data3 = reader.mutable_data_info(); cout<<"data_t {\n"; cout<<"data_int_info: "<<data3->data_int_info()<<endl; cout<<"name: "<<data3->name()<<endl; cout<<"}\n"; for (int i=0;i<reader.vector_info_size();++i) { cout<<"kv_t {\n"; const demo::kv_t &data4 = reader.vector_info(i); cout<<"key: "<<data4.key()<<endl; cout<<"value: "<<data4.value()<<endl; cout<<"}\n"; } return 0; }
//編譯的指令碼
protoc --cpp_out=. msg.proto #生成對應的msg.pb.h和msg.pb.cpp檔案
g++ protobuff_demo.cc msg.pb.cc -o protobuff_test -lprotobuf
./protobuff_test
rm -rf ./protobuff_test msg.pb.cc msg.pb.h
其實所有的介面 都是將訊息序列化後從一個服務或者機器上放到另一個緩衝區中 網路也可抽象成一個緩衝區 其實核心網路緩衝區就是 之後通過網路傳送到另一個 機器上的緩衝區中 再次反序列化解析出來