用Java编写分隔C ++ Protobuf消息和读取

时间:2015-08-11 22:38:47

标签: java c++ protocol-buffers

我正在使用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如何响应半封写的消息。理论上,它应该在返回之前等待消息大小大小的数据。

1 个答案:

答案 0 :(得分:4)

不幸的是,parseDelimitedFrom()writeDelimitedTo()方法仍未添加到C ++库中。

我在回答你提到的一个问题时所写的代码仍然是在C ++中实现它的最佳方法:

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

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

事实上,当Protobuf首次开源时,即使在Java中也不存在parseDelimitedFrom()。我后来特意将其添加为开源库用户的权宜之计 - 很多人问我们如何将多个消息写入文件,并告诉他们“你应该开发自己的框架库”似乎不是很好

Google可能是一家庞大的公司,但当时我是唯一的人,全职工作在Protocol Buffers上。不幸的是,由于我不太记得的原因,我只用Java实现了这些函数,并且从来没有用C ++添加它们。回想起来,它看起来有点傻 - 编写C ++代码并不是很难,正如你在上面的链接中看到的那样。但是我有很多事要做,就像你想象的那样。

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

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