protobuf 映射字段中元素的顺序

The order of elements in a protobuf map field

我的协议缓冲区消息中定义了很多映射字段。这些消息在 C++ 中填充并在不同的 C++ 组件中接收,该组件使用 DescriptorReflection API 读取它们的内容。

给定一个地图字段,说:

map <int32, int32> my_map = 1;

这与类似这样的东西的运输方式相同:

message my_map_entry {
  int32 key = 1;
  int32 value = 2;
}
repeated my_map_entry my_map = 1;

据我了解 DescriptorReflection 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 可能会以随机顺序序列化字段。