Mar*_*n G 3 c++ protocol-buffers
我在协议缓冲区消息中定义了许多映射字段。这些消息用 C++ 填充,并在不同的 C++ 组件中接收,该组件使用Descriptor和ReflectionAPI 读取消息内容。
给定一个地图字段,说:
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 消息是否可能是有序的?如果是这样,则当找到更大的键时,可以停止在映射中查找整数键。当我在应用程序中处理接收到的地图字段时,这可以给我带来潜在的优化。
您不能假设序列化后映射的顺序是相似的。
以下引用摘自protobuf 网站:
地图值的线路格式排序和地图迭代排序未定义,因此您不能依赖于特定顺序的地图项
一般来说,protobuf 可以按随机顺序序列化字段。
| 归档时间: |
|
| 查看次数: |
5189 次 |
| 最近记录: |