初探
protobuf是一种类似xml生成java对象的技术,经过protoc编译.proto文件为.h和.cc文件供给C++调用。是一种数据对象生成方式,.proto定义对象的个格式。
- data.proto
syntax = "proto3";
package train_set;
message PhoneNumber {
string number = 1;
int32 type = 2 ;
}
message Person {
string name = 1;
int32 id = 2;
string email = 3;
repeated PhoneNumber phone = 4;
}
执行
protoc --cpp_out=. data.proto
生成
.cc和.h两个文件,在cpp中
# include <iostream>
# include <fstream>
# include <string>
# include "data.pb.h"
using namespace std;
int main(int argc,char *argv[]){
train_set::Person person = train_set::Person();
person.set_name("rrr");
for(int i=0;i<10;++i){
train_set::PhoneNumber * phone = person.add_phone(); //嵌套,先add再set
phone->set_number("123");
}
fstream out = fstream("ddd.model",ios::out |ios::trunc| ios::binary);
person.SerializeToOstream(&out);
out.close(); //序列化后记得关闭流
out.clear();
// cout<<person.SerializeAsString()<<endl;
fstream in = fstream("ddd.model",ios::in | ios::binary); // 反序列化
train_set::Person person2;
person2.ParseFromIstream(&in);
// cout<<person2.SerializeAsString()<<endl;
cout<<person2.name()<<endl;
for(int i=0;i<person2.phone_size();++i){
train_set::PhoneNumber phone = person2.phone()[i];
cout<<phone.number()<<endl;
}
in.close();
in.clear();
return 0;
}
编译
g++ data.pb.cc protobuf_test.cpp -o aa.out -std=c++11 -I /usr/local/include/ -L /usr/local/lib/ -lprotobuf -lpthread
生成
运行
./aa.out
输出
rrr
123
123
123
...
123