预序列化原型消息的某些字段
Pre-serializing some fields of a proto message
假设我有一个原型结构,如下所示:
message TMessage {
optional TDictionary dictionary = 1;
optional int specificField1 = 2;
optional TOtherMessage specificField2 = 3;
...
}
假设我正在使用C++。这是主进程中使用的消息存根,用于使用网络向节点群发送信息。特别地,dictionary
字段1)非常重2)对于所有序列化的消息都是通用的,并且下面的所有特定字段都填充了目标节点特有的相对较小的信息。
当然,dictionary只构建了一次,但它的大部分运行时间都花在了为每个新节点一次又一次地序列化公共dictionary
部分上。
明显的优化是将dictionary
预序列化到字节字符串中,并将其作为bytes
字段放入TMessage
中,但这对我来说有点讨厌
我说得对吗?没有内置的方法可以在不破坏消息结构的情况下预序列化消息字段?这听起来像是为proto编译器开发一个好插件的想法。
Protobuf的设计使得串联===组合,至少对于根消息是这样。这意味着您可以用和字典序列化一个对象,并在某个地方快照字节。现在,对于每一条真实的消息,您都可以粘贴该快照,然后用和的其他字段序列化一个对象——只需在之后直接删除它:不需要额外的语法。这在语义上等同于同时序列化它们。事实上,由于它将保留字段顺序,因此它实际上也应该是相同的字节。
这有助于您在整个过程中使用"可选":)
Marc的答案非常适合您的用例。这里只是另一个选择:
- 字段必须是子消息,就像
TDictionary
一样 - 使用外部消息的另一个变体,用
bytes
代替要保存的子消息:
消息TMessage_preseialized{可选字节字典=1;。。。}
- 现在您可以单独序列化
TDictionary
,并将生成的数据放入bytes
字段。在protobuf格式中,子消息和bytes
字段以相同的方式编写。这意味着您可以序列化为TMessage_preserialized
,但仍可以反序列化为普通的TMessage
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 如何将标准容器作为字段添加到 OMNet++ 消息中?
- 使用不同的字段解析消息
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- 如何在消息文件中获取用户定义的字段
- 预序列化原型消息的某些字段
- 按字段过滤消息
- 如何在 protobuf 中使用反射将预分配的消息设置为字段C++
- 遍历所有字段并在 protobuf 消息中获取它们的值
- 使用快速修复指定 FIX 消息中字段的顺序
- 如何在解析文本格式的 protobuf 消息时忽略错误的字段
- 如何将重复字段部分合并到消息中
- 如何在协议缓冲区中设置嵌套消息的字段
- 使用Protocol Buffers检索带有字段描述符的父消息中的字段名
- 打印Protobuf消息时省略字段
- 消息扩展名不能有必需的字段
- 使用模板检查结构体中的字段,启用函数if,并在失败时给出一个漂亮的错误消息
- (普罗托布夫)无法解析类型 "data.Data" 的消息,因为它缺少必填字段:ID