【问题标题】:Writing Delimited C++ Protobuf Messages and Reading in Java用 Java 编写分隔的 C++ Protobuf 消息和读取
【发布时间】:2015-08-11 22:38:46
【问题描述】:

我正在用 C++ 将多个 protobuf 消息写入一个文件。

int fifoPipe = open("/media/my_pipe", O_WRONLY);

MyModel *model = new MyModel();

// Write to fifo pipe.
model->SerializeToFileDescriptor(fifoPipe);

我读到消息大小是在消息数据之前自动写入文件的。显然情况并非如此:

https://developers.google.com/protocol-buffers/docs/techniques?hl=en

所以在 Java 中应该可以像这样读取消息:

MyModel.parseDelimitedFrom(fileInputStream);

但是这里有问题:

Cannot deserialize protobuf data from C++ in Java

Are there C++ equivalents for the Protocol Buffers delimited I/O functions in Java?

也就是说消息大小必须手动写入。

由于问题有点老,这个程序可能已经改变了。

在 C++ 中编写多条消息并在 Java 中读取这些消息的正确方法是什么?

还要考虑 Java 将如何响应写了一半的消息。理论上它应该在返回之前等待消息大小的数据出现。

【问题讨论】:

  • 当我阅读它时,stackoverflow.com/questions/2340730/… 中的 C++ 代码将写入 Java 方法 parseDelimitedFrom 所期望的长度。
  • @JesperSM 这里的解释相同。 tzaman 的回答表明 Java 实现了它,而 C++ 没有。有了谷歌拥有的所有资源,人们不得不想知道为什么会这样。
  • 没错,但代码又是由个人而非公司编写的,尤其是开源代码。至少 Kenton Varda 足以发布一个有用的实现。你不会是第一个从 Stackoverflow 复制和粘贴几行代码来完成工作的人...... ;-)

标签: java c++ protocol-buffers


【解决方案1】:

很遗憾,parseDelimitedFrom()writeDelimitedTo() 方法仍未添加到 C++ 库中。

我在回答您引用的一个问题时编写的代码仍然是在 C++ 中实现此功能的最佳方式:

https://stackoverflow.com/a/22927149/2686899

Google 及其所有资源都没有在 C++ 中添加这些的主要原因是因为 Google 内部根本不使用这种格式。对于网络通信,Google 使用其内部 RPC 协议(与他们最近开源的GRPC 非常相似),并且为了将消息存储到磁盘,它们通常使用各种内部格式,这些格式比这种“分隔”格式更有特色(例如,您可以考虑使用 sqlite)。

事实上,当 Protobuf 首次开源时,parseDelimitedFrom() 甚至在 Java 中都不存在。我后来专门添加了它,作为开源库用户的权宜之计——很多人问我们如何将多条消息写入一个文件,并告诉他们“你应该开发自己的框架库”似乎不太好.

Google 可能是一家大公司,但当时我是唯一全职从事 Protocol Buffers 工作的人。不幸的是,由于我不太记得的原因,我只在 Java 中实现了这些函数,而从未有时间在 C++ 中添加它们。回想起来,这似乎有点愚蠢——编写 C++ 代码不会很难,正如您在上面的链接中看到的那样。但正如你想象的那样,我还有很多事情要做。

当前的 Protobuf 团队于 2010 年接手,我开始从事其他工作(最终离开了 Google)。我不确定他们为什么没有将此代码添加到 C++ 库中,但我的猜测是没有足够的人要求它并且他们专注于其他事情。我敢打赌,如果你提交一个错误,并链接到我的代码——或者更好的是,你自己提交一个拉取请求——他们可能会接受它。 (我会自己提交一个拉取请求,但现在我没有时间编写必要的单元测试等......)

编辑:好的,根据我的更好判断,我花时间准备了一个拉取请求:https://github.com/google/protobuf/pull/710

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多