Proto编码 Tips
- 每个消息字段定义都有唯一的编号。这些编号用于标记字段在消息字节中的位置。并且在消息中不应更改。更改后会影响接收者消息的位置。
- 范围1 - 15 需要一个字节进行编码,所以效率最高。常用字段使用1 - 15进行编码。
- 范围16 - 2047 需要二个字节进行编码。
- 可以指定的最小字段编号为1,最大字段编号为229-1 或 536,870,911。也不能使用数字 19000 到
19999(FieldDescriptor :: kFirstReservedNumber 到 FieldDescriptor ::
kLastReservedNumber),因为它们是为 Protocol Buffers实现保留的。 - 尽量控制编码大小,不要出现超大的消息结构。
- reserved用户定义保留编号,或者保留节点。
字段规则Tips
- 字段名不能重复,必须唯一。
- repeated type fieldname 在字段前面加,定义一个类型数组
- 在 proto3 中,纯数字类型的 repeated 字段编码时候默认采用 packed 编码
常规类型
主要编码方式是Base 128 Varints 编码。主要是根据数据长度,确定字节的大小。
下面是各个语言的数据类型的对照表
map 类型
- map类型用来表示字典类型。
- map 是不能用 repeated 修饰的。
- 线性数组和 map 迭代顺序的是不确定的,所以你不能依靠你的 map 是在一个特定的顺序。
- 为 .proto 生成文本格式时,map 按 key 排序。数字的 key 按数字排序。
- 从数组中解析或合并时,如果有重复的 key,则使用所看到的最后一个 key(覆盖原则)。从文本格式解析映射时,如果有重复的 key,解析可能会失败。
枚举
在message 中可以嵌入枚举类型
枚举类型需要注意的是,一定要有 0 值。
- 枚举为 0 的是作为零值,当不赋值的时候,就会是零值。
- 为了和 proto2 兼容。在 proto2 中,零值必须是第一个值。
JSON Mapping
Proto3 支持 JSON 中的规范编码,使系统之间共享数据变得更加容易。编码在下表中按类型逐个描述。
命名规范
message 采用驼峰命名法。message 首字母大写开头。字段名采用下划线分隔法命名。
message SongServerRequest {
required string song_name = 1;
}