博客: blog.shinelee.me | 博客园 | 优快云
这篇文章中,我们将定义一个相对复杂的数据结构,直接分析其序列化后的二进制文件。
Proto文件
编写addressbook.proto文件,在官方例子上略作修改,增加了float
字段,以分析浮点数的存储方式。
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;
repeated float weight_recent_months = 100 [packed = true];
}
message AddressBook {
repeated Person people = 1;
}
生成编解码文件,addressbook.pb.cc和addressbook.pb.h。
protoc.exe addressbook.proto --cpp_out=.
序列化
编写如下代码,将address_book
对象序列化,保存到二进制文件address_book.bin。
int main()
{
tutorial::AddressBook address_book;
tutorial::Person* person = address_book.add_people();
person->set_id(1);
person->set_name("Jack");
person->set_email("Jack@qq.com");
tutorial::Person::PhoneNumber* phone_number = person->add_phones();
phone_number->set_number("123456");
phone_number->set_type(tutorial::Person::HOME);
phone_number = person->add_phones();
phone_number->set_number("234567");
phone_number->set_type(tutorial::Person::MOBILE);
person->add_weight_recent_months(50);
person->add_weight_recent_months(52);
person->