开发学院

您的位置:首页>教程>正文

教程正文

Protobuf3 Maps

Protobuf3 Maps

  如果要创建关联映射作为数据定义的一部分,协议缓冲区提供了一种方便快捷的语法:

map<key_type, value_type> map_field = N;

  其中key_type可以是任何整数或字符串类型(除浮点类型和字节以外的任何标量类型)。请注意,枚举不是有效的key_type,value_type可以是除另一个映射之外的任何类型。

  因此,例如,如果您想为一个项目创建map,其中每个项目消息都与一个字符串键相关联,您可以这样定义它:

map<string, Project> projects = 3;

  映射字段不能重复。

  map值线格式排序和map迭代排序未定义,因此您不能依赖于项目的map特定顺序。

  为生成文本格式时。proto,地图按键排序。数字键按数字排序。

  为.proto生成文本格式时,map按键排序。数字键按数字排序。

  从线上解析或合并时,如果有重复的map键,则使用最后看到的键。从文本格式解析map时,如果存在重复的键,解析可能会失败。

  如果为映射字段提供了键但没有值,则序列化该字段时的行为取决于语言。在c++、Java和Python中,该类型的默认值是序列化的,而在其他语言中,没有任何值是序列化的。

  生成的map API目前可用于所有受支持的proto3语言。你可以在相关的API参考中找到更多关于你选择的语言的map API。

向后兼容性

  map语法相当于线上的以下内容,因此不支持map的协议缓冲区实现仍然可以处理数据:

message MapFieldEntry {
  key_type key = 1;
  value_type value = 2;
}

repeated MapFieldEntry map_field = N;

  任何支持映射的协议缓冲区实现都必须生成和接受可以被上述定义的数据。