博客: 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->add_weight_recent_mont

本文详细介绍了如何使用Protocol Buffers(Protobuf)进行序列化和反序列化操作,重点讲解了如何解析二进制文件。通过分析addressbook.proto文件,展示了Proto文件的结构,探讨了浮点数在二进制文件中的存储方式。内容包括Proto文件的编写、序列化到二进制文件、逐字节解析二进制文件以及反序列化过程,强调了repeated字段的编码规则和嵌套message的处理方式。
最低0.47元/天 解锁文章
968

被折叠的 条评论
为什么被折叠?



