假设我有一个如下所示的原型结构:
message TMessage {
optional TDictionary dictionary = 1;
optional int specificField1 = 2;
optional TOtherMessage specificField2 = 3;
...
}
假设我正在使用C ++。这是主进程中使用的消息存根,用于使用网络向一堆节点发送信息。特别是,dictionary
字段对于所有序列化消息来说都很常见,并且所有以下特定字段都填充了特定于目标节点的相对较小的信息。
当然,词典只构建一次,但是在每个新节点一次又一次地序列化公共dictionary
部分时花费了大部分运行时间。
明显的优化是将dictionary
预序列化到字节字符串中并将其作为TMessage
字段放入bytes
,但这对我来说有点讨厌。
我是否正确,没有内置的方法来预先序列化消息字段而不破坏消息结构?对于原型编译器来说,这听起来像是一个很好的插件。
答案 0 :(得分:2)
Protobuf的设计使得连接===组合,至少对于根消息而言。这意味着您可以使用 字典序列化对象,并在某处对字节进行快照。现在,对于每个真实消息,您可以粘贴该快照,然后使用 其他字段序列化对象 - 只需在此之后直接敲击它:不需要其他语法。这在语义上与同时序列化它们完全相同。事实上,由于它将保留字段顺序,它实际上也应该是相同的字节。
您使用"可选"整个:)
答案 1 :(得分:2)
Marc的答案非常适合您的用例。这是另一种选择:
TDictionary
一样。bytes
代替您要预序列化的子邮件:message TMessage_preserialized { optional bytes dictionary = 1; ... }
TDictionary
并将结果数据放入bytes
字段。在protobuf格式中,子消息和bytes
字段以相同的方式写出。这意味着您可以序列化为TMessage_preserialized
并仍然正常反序列化TMessage
。