如何在C++、Java和Python中通过流交换二进制结构数据?
说明
我需要在C++、Java和Python程序之间通过一个流(比如TCP套接字或管道)交换二进制结构化数据。
所以我想问:
如何在C++、Java和Python之间通过流交换二进制结构化数据?
- 我不能提前创建完整的对象来进行序列化——必须能够实现数据的流入和流出。
- 由于性能问题,我需要使用某种二进制协议格式。
- 我希望(如果可能的话)使用一些现成的库,因为自己手动编写所有的(反)序列化代码实在太麻烦了。
我想要的
我的想法是类似于(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。