- 官方文档地址
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
将序号保留 int32
、uint32
、int64
、uint64
和bool
类型之间是互相兼容的sint32
和sint64
类型之间是互相兼容的string
和bytes
类型之间是互相兼容的(前提是bytes
是UTF-8格式)fixed32
和sfixed32
类型之间是互相兼容的fixed64
和sfixed64
类型之间是互相兼容的
- map类型中的键的类型只能是整型或字符串(即除浮点型和bytes类型之外的所有标量都支持),map类型中的值的类型可以是除map以外的所有类型
- map类型的字段不能用
repeated
修饰 - map类型的数据的顺序,如果键是字符串类型,则通过键字符串排序,如果键是数字,则通过键的数字大小排序