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

标签 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 如何响应写了一半的消息。理论上它应该等待消息大小的数据在返回之前出现。

最佳答案

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

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

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

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

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

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

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

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

关于java - 用 Java 编写分隔的 C++ Protobuf 消息和读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953201/

相关文章:

java - 哪个是 CDI @Produces 注释的 Spring 等效项?

java - 文件内容到字节数组?

c++ - 在 C++ 中预初始化 map

C++ 年龄计算器 - 查找 2 个日期之间时间的最有效方程

java - 使用 JNI 将 GPB 序列化数据从 Java 高效传递到 C++

c++ - proto c++ 实现 - "marked ‘override’,但不会覆盖“错误

json - Dart-RPC:使用 Protocol Buffers 序列化而不是 JSON

java - 我应该在 Android 中使用 Azure 中的哪个 sdk 库来使用媒体服务?

java - 在骰子值上找到可能的节点

与 vector 相比,C++ STL 队列内存使用情况?