Protocol Buffers 3 学习笔记

  • 官方文档地址
  • syntax = "proto3";必须放在.proto文件首行,之前不能有空白行或者注释行,如果不存在或者没有放在首行,则编译器认为是proto2
  • 字段对应的序号,在1-15之内(含)时,编码时占用一个字节,当序号在16-2047之间(含),编码时占用2个字节
  • 字段对应的序号,最小是1,最大是536,870,911。其中19000-19999之间(含)为保留数字,不能使用,否则编译时会报错。自定义的保留数字(用reserved修饰的数字)也不能用作序号,否则编译时也会报错。
  • repeated修饰的集合数据是有序的
  • 注释使用的C/C++注释语法,即:///*...*/
  • 保留字段和数字,用reserved修饰,用于禁用某些字段名或者序号。例如:本次修改删除了一个字段,为避免其他人员复用此字段或序号,故可以将保留字段和序号设置为保留,从而避免后续版本与旧版本字段产生歧义、冲突、匪夷所思的bug
  • 枚举类型必须包含一个序号为0的枚举字段,并且需要是第一个枚举字段
  • 可以通过option allow_alias = true;来支持不同常量指向相同的值
  • 同一个.proto文件中(含导入的其它.proto文件),不可以包含相同的枚举字段名称,不同的枚举类型中也不可以包含相同的枚举字段名称,否则编译器会报错
  • 消息类型的更新规则
    • 不要改变已存在字段的序号
    • 如果新增了字段,新生成的协议代码能够正常解析旧的协议数据
    • 已存在的字段可以移除,但序号不要被重新使用,可以通过repeated将序号保留
    • int32uint32int64uint64bool类型之间是互相兼容的
    • sint32sint64类型之间是互相兼容的
    • stringbytes类型之间是互相兼容的(前提是bytes是UTF-8格式)
    • fixed32sfixed32类型之间是互相兼容的
    • fixed64sfixed64类型之间是互相兼容的
  • map类型中的键的类型只能是整型或字符串(即除浮点型和bytes类型之外的所有标量都支持),map类型中的值的类型可以是除map以外的所有类型
  • map类型的字段不能用repeated修饰
  • map类型的数据的顺序,如果键是字符串类型,则通过键字符串排序,如果键是数字,则通过键的数字大小排序
posted @ 2022-12-21 13:51  Freelancy  阅读(61)  评论(0编辑  收藏  举报