protobuf格式

来源:互联网 发布:java helloworld代码 编辑:程序博客网 时间:2024/06/01 07:48

protobuf 消息

message由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式:

限定修饰符 | 数据类型 | 字段名称 | = | 字段编码值 | [字段默认值]

 

限定修饰符:

  • Required:表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值;对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。
  • Optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值;对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。
  • Repeated:表示该字段可以包含0 ~ N个元素,可以看作是在传递数组。

 

字段名称:

字段名称的命名与C、C++、Java等语言的变量命名方式几乎是相同的。
protobuf建议字段的命名采用以下划线分割的驼峰式,例如 first_name 而不是firstName。

 

字段编码值:

编码值的取值范围为 1~2^32(4294967296)。

消息中的字段的编码值无需连续,只要是合法的,并且不能在同一个消息中有字段包含相同的编码值。

protobuf 建议把经常要传递的值把其字段编码设置为1-15之间的值。

 

字段默认值:

发送数据时,对于required数据类型,如果用户没有设置值,则使用默认值传递到对端;

接收数据时,对于optional字段,如果没有接收到optional字段,则设置为默认值。

 

 

另外:

  • message消息支持嵌套定义,消息可以包含另一个消息作为其字段,也可以在消息内定义一个新的消息;
  • proto定义文件支持import导入其它proto定义文件;
  • 每个proto文件指定一个package名称,对于java解析为java中的包。对于C++则解析为名称空间。