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

BAR*_*BAR 1 c++ java protocol-buffers

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

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

MyModel *model = new MyModel();

// Write to fifo pipe.
model->SerializeToFileDescriptor(fifoPipe);
Run Code Online (Sandbox Code Playgroud)

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

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

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

MyModel.parseDelimitedFrom(fileInputStream);
Run Code Online (Sandbox Code Playgroud)

但是这里有问题:

无法在 Java 中从 C++ 反序列化 protobuf 数据

Java 中的协议缓冲区分隔 I/O 函数是否有 C++ 等效项?

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

由于问题有点陈旧,因此此程序可能已更改。

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

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

Ken*_*rda 5

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

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

/sf/answers/1604900461/

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

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

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

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

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