如何在C++、Java和Python中通过流交换二进制结构数据?

2 投票
2 回答
820 浏览
提问于 2025-04-18 01:33

说明

我需要在C++、Java和Python程序之间通过一个流(比如TCP套接字或管道)交换二进制结构化数据。

所以我想问:

如何在C++、Java和Python之间通过流交换二进制结构化数据?

  1. 我不能提前创建完整的对象来进行序列化——必须能够实现数据的流入和流出
  2. 由于性能问题,我需要使用某种二进制协议格式。
  3. 我希望(如果可能的话)使用一些现成的库,因为自己手动编写所有的(反)序列化代码实在太麻烦了。

我想要的

我的想法是类似于(C++写入者):

 StreamWriter sw(7);  // fd to output to.

 while( (DataSet const ds(get_next_row_from_db())) ) {
    sw << ds;  // data set is some structured data
 }

还有C++读取者:

StreamReader sr(9);  // fd for input

while(sr) {
   DataSet const ds(sr);

   // handle ds
}

Java和Python也希望有类似的语法和语义。

我做了什么

我考虑过使用像Google Protocol Buffers这样的现成库,但它不支持流处理,并且在序列化之前需要创建完整的对象层次结构。

我也想过自己创建一个二进制格式,但这工作量太大,实在太麻烦了。

2 个回答

0

我建议你明确记录一下你的数据类型是怎么被序列化的,也就是怎么把数据转成可以存储或传输的格式,并根据需要在每种编程语言中写出序列化和反序列化的代码。我发现,只要把数据序列化的方式写清楚,这个过程其实挺简单的。

你还有一个主要的选择,就是统一使用某个平台的默认序列化方法,但这就意味着你得先搞清楚这个方法,然后在其他语言中实现它。这通常比较麻烦,因为默认的序列化方法往往比较复杂,而且文档说明也不太清楚。

0

有几个选择可以用来处理数据,它们分别是 Apache Thrift、谷歌的协议缓冲区(protocol buffer)和 Apache Avro。你可以在这个链接上找到一个很好的比较:http://www.slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro

所以我建议你试试 Apache Avro。

撰写回答