跨平台和语言(de)序列化

时间:2009-09-14 13:57:31

标签: language-agnostic serialization cross-platform

我正在寻找一种以最方便的方式序列化一堆C ++结构的方法,以便序列化可以跨C ++和Java(至少)以及32位/ 64位,大/小端平台移植。要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象。

我们的想法是将结构序列化为一个八位字节blob,我们可以“通常”存储在数据库中并在以后读出。因此,每当结构发生变化时都要避免更改数据库,并且还要避免将每个数据成员分配给字段 - 即我们只希望一个表将所有内容“一般地”保存为二进制blob。这应该减少开发人员的工作量,并在结构发生变化时需要更少的更改。

我看过boost.serialize,但不认为有办法实现与Java的兼容性。同样用于继承Java中的Serializable。

如果有办法,可以通过最好的IDL文件开始,因为我们已经有了描述结构的IDL文件。

提前干杯!

7 个答案:

答案 0 :(得分:6)

我很惊讶Jon Skeet还没有突然发现这个: - )

Protocol Buffers几乎是针对这种情况设计的 - 传递结构化数据跨语言。

也就是说,如果您按照建议的方式使用数据库,那么您实际上不应该使用像Oracle或SQL Server这样的全功能RDBMS,而是使用像Berkeley DB这样的轻量级键值存储库许多“云桌”引擎。

答案 1 :(得分:6)

如果我想真正实现跨语言,我通常会建议使用JSON,因为javascript支持的简易性和abundance of libraries,以及人类可读和可修改的(我更喜欢XML,因为我发现它在字符方面更小,更快,更可读)。然而,它在空间方面并不是最有效的,并且像protocol buffersthrift这样的机器可读格式会有优势(节约可以来自IDL,但也可以用于编码)服务,所以它可能比你想要的重。)

答案 2 :(得分:5)

我偶然发现了一个非常相似的问题。 6年后,这可能对你没用,但希望对其他人有用。

有许多替代方案,遗憾的是没有明显的赢家(尽管有人可能认为JSON是明显的赢家)。甚至谷歌也发布了多种竞争技术(所有这些技术显然都在内部使用):

不要忘记其他答案中公布的替代方案。以下是其他一些内容:

  • YAML:JSON减去所有双引号,但改为使用缩进。它更具人性化,但效率可能更低,特别是随着它变大。
  • BSON(二进制JSON)
  • MessagePack(另一个压缩的JSON)

由于存在如此多的变化,JSON在简单性/便利性和跨平台访问方面显然是赢家。随着JavaScript的兴起,它在过去几年中变得更加流行。很多人可能会将其作为一种事实上的解决方案,而不需要太多考虑(这就是我最初做过的事情:P)。

但是,如果大小成为一个问题,但您更喜欢保持简单而不使用其中一个更高级的库,则可以使用zlib压缩JSON(这就是我'我现在正在做)或其他一些跨平台算法(但那是一个完整的其他主题)。

为了加快C ++中的JSON处理速度,您还可以使用RapidJSON

答案 3 :(得分:1)

为什么没有选择XML,因为这非常适合您的需求。 C ++和Java都允许简单的实现。

此外,我怀疑你的想法是将所有内容作为blob存储在数据库中,使用关系数据库设计数据库的内容,或者切换到支持Java和C ++的http://www.versant.com/en_US/products/objectdatabase等面向对象的数据库。

答案 4 :(得分:1)

您需要ASN.1! (有些人将其称为二进制XML。)ASN.1非常紧凑,因此非常适合在两个系统之间传输数据。对于那些不认为曾经使用过的人:几种Internet协议基于ASN.1模型进行数据序列化!

不幸的是,没有很多可用于Java或C ++的库支持ASN.1。几年前我不得不使用它,但是找不到一个好的,免费的或廉价的工具来支持C ++中的ASN.1。在Objective Systems他们正在销售ASN.1 / XML解决方案,但它非常昂贵。 (C ++和Java的ASN.1 compiler就是这样!)至少花费你一条腿和一条腿! (但是你会有一个只用一只手就可以使用的工具......)

答案 5 :(得分:1)

我建议使用SQLite数据库保存数据。结构可以作为数据库行存储在SQLite表中。

生成的数据库文件在许多不同平台上是二进制兼容的,并且可以作为BLOB存储在主数据库中。我相信文件大小与具有相同数据的压缩XML文件相当,但处理期间的内存使用量将远远低于XML DOM。

答案 6 :(得分:0)

还有Avro。查看this问题,以便比较Apache thrift,协议缓冲区,mes等。