C ++ protobuf:如何通过" SerializeToOstream()"将多个消息写入文件

时间:2017-03-09 06:45:34

标签: c++ file serialization protocol-buffers message

我发现当我使用SerializeToOstream()时,只有最后一条消息写入文件,之前的消息都被以后的调用覆盖。像这样:

我的hello.proto:

string[]

然后我将它编译并在一个cpp文件中使用:

message hello
{
    required int32 f1=1;
    required int32 f2=2;
    optional int32 f3=3;
}

我只发现" p3"写进了这个" hello.data",p1和p2被某种方式覆盖了?

为什么protobuf只写最后一条消息?我们通常使用protobuf来传递多条消息,对吧?那么如何将多条消息写入一个文件?如何纠正我的程序?

1 个答案:

答案 0 :(得分:3)

这里的问题是协议缓冲区不是自定界限的;要解析一条消息,您必须事先知道要读取多少字节。由于有线格式的工作方式,您可以连接两个(或更多)序列化协议缓冲区,但仍然有一个有效的消息;对于任何给定的奇异域,后面的值优先于先前的值。所以正在发生的事情是ParseFromIstream正在读取所有三个序列化消息,就像它们是一条消息一样,并且最后一条消息实际上优先于前两条消息。

要解决此问题,您必须为每封邮件添加某种消息长度前缀。通常,这是通过在每条消息前面加上一个varint来存储其长度来完成的。来自Kenton Varda的这个code就是如何在C ++中实现这一目标的一个很好的例子。