2-Protocol Buffer 基础(c++)

    本教程提供了使用协议缓冲区的基本介绍。通过逐步创建一个简单的示例应用程序,介绍以下内容:

    1.在.proto文件中定义消息格式。
    2.使用 protocol buffer 编译器。
    3.使用c++ protocol buffer API来写入和读取消息。

一、问题描述

    将要使用的示例是一个非常简单的“地址簿”应用程序,它可以从文件中读取和写入人们的联系详细信息。地址簿中的每个人都有姓名、ID、电子邮件地址和联系电话号码。

二、定义协议格式

    要创建地址簿应用程序,需要从.proto文件开始。proto文件中的定义很简单:为要序列化的每个数据结构添加消息,然后为消息中的每个字段指定名称和类型。下面是定义消息的.proto文件addressbook.proto。

syntax = "proto2";

package tutorial;

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    PHONE_TYPE_UNSPECIFIED = 0;
    PHONE_TYPE_MOBILE = 1;
    PHONE_TYPE_HOME = 2;
    PHONE_TYPE_WORK = 3;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = PHONE_TYPE_HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

    proto文件以包声明开始,这有助于防止不同项目之间的命名冲突。在c++中,生成的类将放在与包名匹配的命名空间中。

    接下来,您有您的消息定义。消息只是包含一组类型化字段的聚合。许多标准的简单数据类型都可以作为字段类型使用,包括bool、int32、float、double和string。您还可以通过使用其他消息类型作为字段类型来为消息添加进一步的结构—在上面的示例中,Person消息包含PhoneNumber消息,而AddressBook消息包含Person消息。您甚至可以定义嵌套在其他消息中的消息类型—如您所见,PhoneNumber类型是在Person中定义的。如果您希望某个字段具有预定义值列表中的一个,也可以定义枚举类型—这里您希望指定电话号码可以是以下电话类型之一:PHONE_TYPE_MOBILE、PHONE_TYPE_HOME或PHONE_TYPE_WORK。

    每个元素上的“= 1”、“= 2”标记标识该字段在二进制编码中使用的唯一字段号。字段数1-15比更高的数字需要少一个字节编码,因此作为优化,您可以决定将这些数字用于常用或重复的元素,将字段数16或更高的数字用于不太常用的可选元素。repeated字段中的每个元素都需要重新编码字段号,因此repeated字段特别适合进行此优化。

    optional:该字段可以设置,也可以不设置。如果未设置可选字段值,则使用默认值。对于简单类型,您可以指定自己的默认值,就像在示例中为电话号码类型所做的那样。否则,使用系统默认值:数字类型为零,字符串为空字符串,bool为false。对于嵌入式消息,默认值始终是消息的“默认实例”或“原型”,它没有设置任何字段。调用访问器获取未显式设置的可选(或必需)字段的值总是返回该字段的默认值。
    repeated:该字段可以重复任何次数(包括零)。重复值的顺序将保留在protocol buffer中。可以将重复字段视为动态大小的数组。

    Required:必须提供该字段的值,否则消息将被视为“未初始化”。如果libprotobuf在调试模式下编译,序列化未初始化的消息将导致失败。除此之外,Required字段的行为与optional字段完全相同。


    注意:非常小心地将字段标记为Required。如果在某些时候您希望停止写入或发送Required字段,将该字段更改为可选字段将会出现问题-旧的阅读器会认为没有此字段的消息是不完整的,并且可能会拒绝或无意中丢弃它们。您应该考虑为缓冲区编写特定于应用程序的自定义验证例程。在谷歌内部,Required字段是非常不受欢迎的;在proto2语法中定义的大多数消息只使用可选的和重复的。(Proto3根本不支持必填字段。)

三、编译Protocol Buffers

    现在有了.proto,接下来需要做的就是生成读取和写入Add

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值