Protobuf ParseDelimitedFrom在C ++中的实现

时间:2014-03-12 15:27:07

标签: c++ protocol-buffers poco protobuf-net

C#Publisher使用" writeDelimitedTo"在套接字上以自定义protobuff格式发布continuos marketdata消息。 API。我必须阅读C ++中的所有消息并将其解密。以下是我的代码。由于C ++没有" parseDelimitedFrom"所以在经过本论坛的多个建议之后编写了类似下面的内容。

现在我的问题是 - 参考下面的代码,如果第一个消息大小小于1024,那么在第一次迭代中,我将获得第一条消息的完整流和第二条消息的部分流。在反序列化第一条消息后,如何从套接字中读取第二条消息的剩余流并将其与我在上一次迭代中读取的流合并?

1 个答案:

答案 0 :(得分:4)

编辑: Support for "delimited" format is now part of the official protobuf library.以下帖子提前添加。

我已经在C ++中编写了parseDelimitedFromwriteDelimitedTo的最佳效率版本(read的{​​{1}}和write方法):

https://github.com/capnproto/capnproto/blob/06a7136708955d91f8ddc1fa3d54e620eacba13e/c%2B%2B/src/benchmark/protobuf-common.h#L101

随意复制。

这些实现读取/写入Uncompressed / ZeroCopyInputStream。(嗯,由于某种原因我的ZeroCopyOutputStream声明使用write,但你应该能够只需将其更改为FileOutputStream。)

因此,您需要创建一个ZeroCopyOutputStream来自您的ZeroCopyInputStream,然后将其传递给我的StreamSocket

看起来read()是一个经典的复制读取界面。因此,您应该使用StreamSocket作为CopyingInputStreamAdaptor,并将ZeroCopyInputStream的实施内容包含在CopyingInputStream中。

https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream_impl_lite#CopyingInputStreamAdaptor