1. 程式人生 > >protobuf 序列化 反序列介面

protobuf 序列化 反序列介面

包括    C陣列序列化與反序列化 ,檔案描述符序列化與發序列化 ,string類的序列化與反序列化 ,C++ stream 序列化和反序列化

你也可以在/usr/local/include/google/目錄下,查詢包含"SerializeToArray"所有的檔案,同時列印所在行
      grep "SerializeToArray" -r /usr/local/include/google/ -n      來查詢 你要的介面    改變關鍵字就可以  

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);   //反序列化
下面我們來使用一個稍微複雜的例子 來使用protobuf的介面
//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

其實所有的介面 都是將訊息序列化後從一個服務或者機器上放到另一個緩衝區中  網路也可抽象成一個緩衝區   其實核心網路緩衝區就是    之後通過網路傳送到另一個 機器上的緩衝區中 再次反序列化解析出來