Protobuf ParseDelimitedFrom C++ 中的实现

Posted

技术标签:

【中文标题】Protobuf ParseDelimitedFrom C++ 中的实现【英文标题】:Protobuf ParseDelimitedFrom implementation in C++ 【发布时间】:2014-03-12 15:27:07 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

编辑: Support for "delimited" format is now part of the official protobuf library. 下面的帖子早于它被添加。

我在这里用 C++ 编写了 parseDelimitedFromwriteDelimitedTo 的最佳效率版本(Uncompressedreadwrite 方法):

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

随意复制。

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

因此,您需要创建一个从您的StreamSocket 读取的ZeroCopyInputStream,然后将其传递给我的read()

看起来StreamSocket是一个经典的复制阅读界面。因此,您应该使用CopyingInputStreamAdaptor 作为您的ZeroCopyInputStream,包装一个从您的StreamSocket 读取的CopyingInputStream 的实现。

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

【讨论】:

您好 Kenton,感谢您的回复。 @RakeshKumar - 感谢某人回答的最佳方式是接受和/或支持它。 :) 很棒的代码是 404 在 github 上找不到了 : ( @ZFY 修复了链接。

以上是关于Protobuf ParseDelimitedFrom C++ 中的实现的主要内容,如果未能解决你的问题,请参考以下文章

深入protoBuf

protobuf相关优化杂谈

protobuf菜鸟教程

Protobuf——Protobuf简介

ProtoBuf系列protobuf的介绍与安装

php protobuf不能为null吗