Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Google Protobuf安装与使用

google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。更详细的介绍见: Protocol Buffers

protobuf安装

1、下载protobuf代码 google/protobuf2、安装protobuf tar -xvf protobuf cd protobuf ./configure --prefix=/usr/local/protobuf make make check make install至此安装完成^_^,下面是配置:(1) vim /etc/profile,添加 export PATH=$PATH:/usr/local/protobuf/bin/ export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/ 保存执行,source /etc/profile。同时在~/.profile中添加上面两行代码,否则会出现登录用户找不到protoc命令。(2) 配置动态链接库 vim /etc/ld.so.conf,在文件中添加/usr/local/protobuf/lib(注意: 在新行处添加),然后执行命令: ldconfig

 .proto文件

.proto文件是protobuf一个重要的文件,它定义了需要序列化数据的结构。使用protobuf的3个步骤是:1 在.proto文件中定义消息格式2 用protobuf编译器编译.proto文件3 用C++/Java等对应的protobuf API来写或者读消息

程序示例(C++版)

该程序示例的大致功能是,定义一个Persion结构体和存放Persion的AddressBook,然后一个写程序向一个文件写入该结构体信息,另一个程序从文件中读出该信息并打印到输出中。1 address.proto文件package tutorial;message Persion {required string name = 1;required int32 age = 2;}message AddressBook {repeated Persion persion = 1;} 编译.proto文件,执行命令: protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto,示例中执行命令protoc --cpp_out=/tmp addressbook.proto ,会在/tmp中生成文件addressbook.pb.h和addressbook.pb.cc。2 write.cpp文件,向文件中写入AddressBook信息,该文件是二进制的 1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include "addressbook.pb.h" 56 using namespace std; 78 void PromptForAddress(tutorial::Persion *persion) { 9 cout << "Enter persion name:" << endl;10 string name;11 cin >> name;12 persion->set_name(name);13 14 int age;15 cin >> age;16 persion->set_age(age);17 }18 19 int main(int argc, char **argv) {20 //GOOGLE_PROTOBUF_VERIFY_VERSION;21 22 if (argc != 2) {23 cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;24 return -1;25 }26 27 tutorial::AddressBook address_book;28 29 {30 fstream input(argv[1], ios::in | ios::binary);31 if (!input) {32 cout << argv[1] << ": File not found. Creating a new file." << endl;33 }34 else if (!address_book.ParseFromIstream(&input)) {35 cerr << "Filed to parse address book." << endl;36 return -1;37 }38 }39 40 // Add an address41 PromptForAddress(address_book.add_persion());42 43 {44 fstream output(argv[1], ios::out | ios::trunc | ios::binary);45 if (!address_book.SerializeToOstream(&output)) {46 cerr << "Failed to write address book." << endl;47 return -1;48 }49 }50 51 // Optional: Delete all global objects allocated by libprotobuf.52 //google::protobuf::ShutdownProtobufLibrary();53 54 return 0;55 } 编译write.cpp文件,g++ addressbook.pb.cc write.cpp -o write `pkg-config --cflags --libs protobuf` (注意,这里的`符号在键盘数字1键左边,也就是和~是同一个按键)。3 read.cpp文件,从文件中读出AddressBook信息并打印 1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include "addressbook.pb.h" 56 using namespace std; 78 void ListPeople(const tutorial::AddressBook& address_book) { 9 for (int i = 0; i < address_book.persion_size(); i++) {10 const tutorial::Persion& persion = address_book.persion(i);11 12 cout << persion.name() << " " << persion.age() << endl;13 }14 }15 16 int main(int argc, char **argv) {17 //GOOGLE_PROTOBUF_VERIFY_VERSION;18 19 if (argc != 2) {20 cerr << "Usage: " << argv[0] << " ADDRESS_BOOL_FILE" << endl;21 return -1;22 }23 24 tutorial::AddressBook address_book;25 26 {27 fstream input(argv[1], ios::in | ios::binary);28 if (!address_book.ParseFromIstream(&input)) {29 cerr << "Filed to parse address book." << endl;30 return -1;31 }32 input.close();33 }34 35 ListPeople(address_book);36 37 // Optional: Delete all global objects allocated by libprotobuf.38 //google::protobuf::ShutdownProtobufLibrary();39 40 return 0;41 }  编译read.cpp文件,g++ addressbook.pb.cc read.cpp -o read `pkg-config --cflags --libs protobuf`4 执行程序本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-04/129793.htm