protobuf 映射字段中元素的顺序
The order of elements in a protobuf map field
我的协议缓冲区消息中定义了很多映射字段。这些消息在 C++ 中填充并在不同的 C++ 组件中接收,该组件使用 Descriptor
和 Reflection
API 读取它们的内容。
给定一个地图字段,说:
map <int32, int32> my_map = 1;
这与类似这样的东西的运输方式相同:
message my_map_entry {
int32 key = 1;
int32 value = 2;
}
repeated my_map_entry my_map = 1;
据我了解 Descriptor
和 Reflection
API 的当前限制,在这里我必须通过迭代接收到的数据来执行查找。当然,我可以将所有数据放在一些更合适的数据结构中,例如 std::unordered_map
如果我想在接收到的地图字段中进行多次查找,但我通常只对每个接收到的地图字段进行一次查找。
我可以假设接收数据的顺序吗?由于协议缓冲区实现中使用的底层数据结构,是否可能对重复的 my_map_entry 消息进行了排序?如果是这样,当找到更大的键时,可以停止在映射中查找整数键。在我的应用程序中处理接收到的地图字段时,这可能会给我带来潜在的优化。
你不能假设序列化后地图的顺序是相似的。
以下引自protobuf website:
Wire format ordering and map iteration ordering of map values is
undefined, so you cannot rely on your map items being in a particular
order
一般来说,protobuf 可能会以随机顺序序列化字段。
我的协议缓冲区消息中定义了很多映射字段。这些消息在 C++ 中填充并在不同的 C++ 组件中接收,该组件使用 Descriptor
和 Reflection
API 读取它们的内容。
给定一个地图字段,说:
map <int32, int32> my_map = 1;
这与类似这样的东西的运输方式相同:
message my_map_entry {
int32 key = 1;
int32 value = 2;
}
repeated my_map_entry my_map = 1;
据我了解 Descriptor
和 Reflection
API 的当前限制,在这里我必须通过迭代接收到的数据来执行查找。当然,我可以将所有数据放在一些更合适的数据结构中,例如 std::unordered_map
如果我想在接收到的地图字段中进行多次查找,但我通常只对每个接收到的地图字段进行一次查找。
我可以假设接收数据的顺序吗?由于协议缓冲区实现中使用的底层数据结构,是否可能对重复的 my_map_entry 消息进行了排序?如果是这样,当找到更大的键时,可以停止在映射中查找整数键。在我的应用程序中处理接收到的地图字段时,这可能会给我带来潜在的优化。
你不能假设序列化后地图的顺序是相似的。
以下引自protobuf website:
Wire format ordering and map iteration ordering of map values is undefined, so you cannot rely on your map items being in a particular order
一般来说,protobuf 可能会以随机顺序序列化字段。