最近学了一下PRotobuf,写了一个简单的例子,如下:
person.proto文件
[cpp] view plain copymessage Person{ required string name = 1; required int32 age = 2; optional string email = 3; enum PhoneType{ MOBILE = 1; HOME = 2; WORK = 3; } message Phone{ required int32 id = 1; optional PhoneType type = 2 [default = HOME]; } repeated string phoneNum = 4; //对应于cpp的vector } 安装好protoc以后,执行protoc person.proto --cpp_out=. 生成 person.pb.h和person.pb.cpp写文件(write_person.cpp):
[cpp] view plain copy#include <iostream> #include "person.pb.h" #include <fstream> #include <string> using namespace std; int main(){ string buffer; Person person; person.set_name("chemical"); person.set_age(29); person.set_email("ygliang2009@Gmail.com"); person.add_phonenum("abc"); person.add_phonenum("def"); fstream output("myfile",ios::out|ios::binary); person.SerializeToString(&buffer); //用这个方法,通常不用SerializeToOstream output.write(buffer.c_str(),buffer.size()); return 0; } 编译时要把生成的cpp和源文件一起编译,如下:g++ write_person.cpp person.pb.cpp -o write_person -I your_proto_include_path -L your_proto_lib_path -lprotoc -lprotobuf运行时记得要加上LD_LIBRARY_PATH=your_proto_lib_path读文件(read_person.cpp):
[cpp] view plain copy#include <iostream> #include "person.pb.h" #include <fstream> #include <string> using namespace std; int main(){ Person *person = new Person; char buffer[BUFSIZ]; fstream input("myfile",ios::in|ios::binary); input.read(buffer,sizeof(Person)); person->ParseFromString(buffer); //用这个方法,通常不用ParseFromString cout << person->name() << person->phonenum(0) << endl; return 0; } 编译运行方法同上:g++ read_person.cpp person.pb.cpp -o read_person -I your_proto_include_path -L your_proto_lib_path -lprotoc -lprotobuf新闻热点
疑难解答