Google 的Protobuf 技术详解
2017-12-20 14:45
323 查看
1、例子
官方例子,建立一个 test.proto 内容如下:syntax = "proto2"; package tutorial; 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 phones = 4; } message AddressBook { repeated Person people = 1; }
2、注意
1、首先 .proto 文件 要有一个 package declaration;
2、 message可以理解为一个类,变量可以使用如下声明【bool, int32, float, double, string】, 同时message可以嵌套定义。
3、message内可以定义enum。
4、message中的数字 =1,或=2 是为了二进制独立编码。1-15 占空间少,可提升效率。16以后占空间大,效率低。因此将常用的那些变量定义为1-15,提高效率。
5、message中的每个filed必须有prefix-修饰词,这些限定词可以是【required,optional,repeated】。
3、结果
protoc –cpp_out=$DST_DIR your/*.proto可以生成***.pb.h 和***.pb.cc
编译后会生成api。
getters have exactly the name as the field in lowercase, and the setter methods begin with set_There are also has_ methods for each singular (required or optional) field which return true if that field has been set. Finally, each field has a clear_ method that un-sets the field back to its empty state.
string 还有 mutable_ 方法返回指针。
4、调用方法
#include <iostream> #include <fstream> #include <string> #include "addressbook.pb.h" using namespace std; // This function fills in a Person message based on user input. void PromptForAddress(tutorial::Person* person) { cout << "Enter person ID number: "; int id; cin >> id; person->set_id(id); cin.ignore(256, '\n'); cout << "Enter name: "; getline(cin, *person->mutable_name()); cout << "Enter email address (blank for none): "; string email; getline(cin, email); if (!email.empty()) { person->set_email(email); } while (true) { cout << "Enter a phone number (or leave blank to finish): "; string number; getline(cin, number); if (number.empty()) { break; } tutorial::Person::PhoneNumber* phone_number = person->add_phones(); phone_number->set_number(number); cout << "Is this a mobile, home, or work phone? "; string type; getline(cin, type); if (type == "mobile") { phone_number->set_type(tutorial::Person::MOBILE); } else if (type == "home") { phone_number->set_type(tutorial::Person::HOME); } else if (type == "work") { phone_number->set_type(tutorial::Person::WORK); } else { cout << "Unknown phone type. Using default." << endl; } } } // Main function: Reads the entire address book from a file, // adds one person based on user input, then writes it back out to the same // file. int main(int argc, char* argv[]) { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION; if (argc != 2) { cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; return -1; } tutorial::AddressBook address_book; { // Read the existing address book. fstream input(argv[1], ios::in | ios::binary); if (!input) { cout << argv[1] << ": File not found. Creating a new file." << endl; } else if (!address_book.ParseFromIstream(&input)) { cerr << "Failed to parse address book." << endl; return -1; } } // Add an address. PromptForAddress(address_book.add_people()); { // Write the new address book back to disk. fstream output(argv[1], ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr << "Failed to write address book." << endl; return -1; } } // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; }
Ref: https://developers.google.com/protocol-buffers/docs/cpptutorial
相关文章推荐
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- [转]Google 的开源技术protobuf 简介与例子
- google开源技术Protobuf
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子(转)
- Google 的开源技术protobuf 简介与例子 .
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子[转]
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子
- Google 的开源技术protobuf 简介与例子