protobuf 映射字段中元素的顺序

Mar*_*n G 3 c++ protocol-buffers

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

给定一个地图字段,说:

map <int32, int32> my_map = 1;
Run Code Online (Sandbox Code Playgroud)

它的传输方式与以下内容相同:

message my_map_entry {
  int32 key = 1;
  int32 value = 2;
}
repeated my_map_entry my_map = 1;
Run Code Online (Sandbox Code Playgroud)

Descriptor由于我已经了解和API的当前限制Reflection,因此这里我必须通过迭代接收到的数据来执行查找。当然,我可以将所有数据放入一些更合适的数据结构中,例如,std::unordered_map如果我想在接收到的地图字段中进行多次查找,但我通常只对每个接收到的地图字段进行一次查找。

我可以假设一些有关数据接收顺序的信息吗?由于协议缓冲区实现中使用的底层数据结构,重复的 my_map_entry 消息是否可能是有序的?如果是这样,则当找到更大的键时,可以停止在映射中查找整数键。当我在应用程序中处理接收到的地图字段时,这可以给我带来潜在的优化。

Bar*_*art 6

您不能假设序列化后映射的顺序是相似的。

以下引用摘自protobuf 网站

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

一般来说,protobuf 可以按随机顺序序列化字段。