C++ 中的 Protobuf ParseDelimitedFrom 实现

Lea*_*hon 1 c++ poco protocol-buffers protobuf-net

C# Publisher 正在使用“writeDelimitedTo”API 通过套接字以自定义 protobuff 格式发布连续市场数据消息。我必须阅读 C++ 中的所有消息并将其反序列化。下面是我的代码。由于 C++ 没有“parseDelimitedFrom”,因此在经过本论坛的多个建议后,编写了如下代码。

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

Ken*_*rda 5

编辑: 对“分隔”格式的支持现在是官方 protobuf 库的一部分。下面的帖子早于它被添加。

我已经在 C++ 中编写了parseDelimitedFrom和 的最佳高效版本writeDelimitedTo( 的readwrite方法Uncompressed):

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

随意复制。

这些实现从 / 写入ZeroCopyInputStream/ ZeroCopyOutputStream。(嗯,出于某种原因,我write被声明为使用FileOutputStream,但您应该能够将其更改为ZeroCopyOutputStream。)

所以,你需要创建一个ZeroCopyInputStream从你的阅读StreamSocket,然后把它传给我的read()

看起来StreamSocket是一个经典的抄读界面。因此,您应该使用CopyingInputStreamAdaptoras your ZeroCopyInputStream,包装CopyingInputStream从您的StreamSocket.

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