开发学院,分享开发教程和最新动态
章节列表 什么是ProtobufProtobuf3 定义数据类型Protobuf3 标量值类型Protobuf3 缺省值Protobuf3 枚举Protobuf3 使用其他消息类型Protobuf3 嵌套类型Protobuf3 更新消息类型Protobuf3 未知字段Protobuf3 Any类型Protobuf3 OneofProtobuf3 MapsProtobuf3 包Protobuf3 定义服务Protobuf3 JSON映射Protobuf3 可选项Protobuf3 生成属于自己的类Protobuf 风格指南Protobuf 编码(1)Protobuf 编码(2)Protobuf 编码(3)Protobuf 技术Protocol Buffer C++实例教程: 为什么使用Protocol Buffer?Protocol Buffer C++实例教程: 定义协议格式Protocol Buffer C++实例教程: 编译Protocol BufferProtocol Buffer C++实例教程: Protocol Buffer APIProtocol Buffer C++实例教程: 发送消息Protocol Buffer C++实例教程: 读取消息Protocol Buffer C++实例教程: 扩展Protocol BufferProtocol Buffer C++实例教程: 优化技巧和高级用法Protocol Buffer C#实例教程: 前言Protocol Buffer C#实例教程:定义协议格式Protocol Buffer C#实例教程:编译Protocol Buffer Protocol Buffer C#实例教程:解析和序列化Protocol Buffer Go实例教程:前言Protocol Buffer Go实例教程:定义协议格式Protocol Buffer Go实例教程:编译Protocol BufferProtocol Buffer Go实例教程:读写消息Protocol Buffer JAVA实例教程:前言Protocol Buffer JAVA实例教程:定义协议格式Protocol Buffer JAVA实例教程:编译Protocol BufferProtocol Buffer JAVA实例教程:Protocol Buffer APIProtocol Buffer JAVA实例教程:写消息Protocol Buffer JAVA实例教程:读消息Protocol Buffer JAVA实例教程:扩展Protocol BufferProtocol Buffer Python实例教程:前言Protocol Buffer Python实例教程:定义消息格式Protocol Buffer Python实例教程:编译Protocol BufferProtocol Buffer Python实例教程:Protocol Buffer APIProtocol Buffer Python实例教程:写消息Protocol Buffer Python实例教程:读取MessageProtocol Buffer Python实例教程:扩展Protocol Buffer

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;

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