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

fwg*_*wgx 11 language-agnostic serialization cross-platform

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

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

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

如果有一种方法可以通过最好的IDL文件来实现,因为我们已经有了描述结构的IDL文件.

提前干杯!

Jef*_*tin 6

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

Protocol Buffers几乎是为这种场景设计的 - 传递结构化数据跨语言.

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


Tod*_*ner 6

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


Mar*_*Roy 5

我在这里遇到了一个非常相似的问题.6年后,这可能对你没用,但希望对其他人有用.

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

不要忘记其他答案中公布的替代方案.这里还有一些:

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

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

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

要加速C++中的JSON处理,您还可以使用RapidJSON.


Jan*_*oom 1

您为什么不选择 XML,因为它完全适合您的需求。C++ 和 Java 都可以轻松实现。

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

  • 由于会产生大量开销,XML 和其他人类可读格式并不是真正的选择。目前,我们正在考虑在一天之内将 1TB 的原始数据存储到单个磁盘上。XML 的巨大开销意味着我们无法存储所需数量的原始数据。 (2认同)