Language Guide (proto3) | proto3 语言指南(十)映射
Maps - 映射
如果要创建关联映射作为数据定义的一部分,协议缓冲区提供了一种方便的快捷语法:
map<key_type, value_type> map_field = N;
…其中key_type
可以是任何整型或字符串类型(因此,除了浮点类型和字节之外的任何标量类型)。注意enum
不是一个有效的key_type
。value_type
可以是除其他map
以外的任何类型。
因此,例如,如果您想创建一个项目映射,其中每个Project
消息都与一个字符串键相关联,您可以这样定义它:
map<string, Project> projects = 3;
- 映射字段不能使用
repeated
关键字。 - 映射值的Wire格式排序和映射迭代排序未定义,因此不能依赖特定顺序的映射项。
- 为.proto生成文本格式时,映射按键排序。数字键按数字排序。
- 如果为映射字段提供键但没有值,则序列化字段时的行为与语言有关。在
C++
、Java
和Python
中,类型的默认值被序列化,而在其他语言中没有任何序列化。
生成的map API
目前适用于所有proto3
支持的语言。你可以在相关的API参考中找到关于你所选择语言的map API
的更多信息。
向下兼容
map语法相当于wire
上的以下语法,因此不支持map的协议缓冲区实现仍然可以处理您的数据:
message MapFieldEntry {
key_type key = 1;
value_type value = 2;
}
repeated MapFieldEntry map_field = N;
任何支持映射的协议缓冲区实现都必须生成并接受上述定义可以接受的数据。