protobuf 序列化 反序列接口

     上次说过一次protobuf  http://blog.csdn.net/kai8wei/article/details/62230878  这次想说一点稍微复杂的但是十分常用的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
#include
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: "<data_int_info()<name()<
//编译的脚本
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

其实所有的接口 都是将消息序列化后从一个服务或者机器上放到另一个缓冲区中  网络也可抽象成一个缓冲区   其实内核网络缓冲区就是    之后通过网络发送到另一个 机器上的缓冲区中 再次反序列化解析出来



你可能感兴趣的:(protobuf)