预序列化原型邮件的某些字段

时间:2017-11-17 22:19:11

标签: c++ optimization serialization protocol-buffers

假设我有一个如下所示的原型结构:

message TMessage {
    optional TDictionary dictionary = 1;
    optional int specificField1 = 2;
    optional TOtherMessage specificField2 = 3;
    ...
}

假设我正在使用C ++。这是主进程中使用的消息存根,用于使用网络向一堆节点发送信息。特别是,dictionary字段对于所有序列化消息来说都很常见,并且所有以下特定字段都填充了特定于目标节点的相对较小的信息。

当然,词典只构建一次,但是在每个新节点一次又一次地序列化公共dictionary部分时花费了大部分运行时间。

明显的优化是将dictionary预序列化到字节字符串中并将其作为TMessage字段放入bytes,但这对我来说有点讨厌。

我是否正确,没有内置的方法来预先序列化消息字段而不破坏消息结构?对于原型编译器来说,这听起来像是一个很好的插件。

2 个答案:

答案 0 :(得分:2)

Protobuf的设计使得连接===组合,至少对于根消息而言。这意味着您可以使用 字典序列化对象,并在某处对字节进行快照。现在,对于每个真实消息,您可以粘贴该快照,然后使用 其他字段序列化对象 - 只需在此之后直接敲击它:不需要其他语法。这在语义上与同时序列化它们完全相同。事实上,由于它将保留字段顺序,它实际上也应该是相同的字节。

您使用"可选"整个:)

答案 1 :(得分:2)

Marc的答案非常适合您的用例。这是另一种选择:

  1. 该字段必须是子消息,就像您的TDictionary一样。
  2. 拥有外部邮件的另一个变体,bytes代替您要预序列化的子邮件:
  3.     message TMessage_preserialized {
            optional bytes dictionary = 1;
            ...
        }
    
    1. 现在,您可以单独序列化TDictionary并将结果数据放入bytes字段。在protobuf格式中,子消息和bytes字段以相同的方式写出。这意味着您可以序列化为TMessage_preserialized并仍然正常反序列化TMessage