protobuf是一种高效的 结构化 数据存储格式,可以用于对结构化数据的串行化。
protobuf格式
建立xx.proto文件
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
required:必须字段,必须赋值,否则在序列化和反序列化时失败
optional:可选字段
repeated:数组字段
后面的数字为位置
编译成其他语言
protoc -I=src_dir --xx_out=dst_dir
其中–xx_out中xx为语言类型,xx可以python,c++等
假定文件名为xx.proto
语言 | 生成文件 | 使用 |
---|---|---|
python | xx_pb2.py | import xx_pb2 |
c++ | xx.pb.cc xx.pb.h | 编译: g++ xx.pb.cc xx.cpp -o xx pkg-config --cflags --libs protobuf 执行:正常和c++一样 |
序列化与反序列化
建立Person.proto,如上xx.proto
c语言序列化与反序列化
生成Person.pb.cc和Person.pb.h,建立Person.cpp文件,如下所示:
#include "Person.pb.h"
#include <iostream>
#include <fstream>
using namespace std;
void reader()
{
Person person;
person.set_name("Lily");
person.set_id(1);
fstream output("person",ios::out|ios::binary);
person.SerializeToOstream(&output);
}
void writer()
{
Person person;
fstream input("person",ios::in|ios::binary);
person.ParseFromIstream(&input);
cout<<person.name()<<endl;
cout<<person.id()<<endl;
}
int main()
{
reader();
writer();
return 0;
}