【问题标题】:Cross-platform and language (de)serialization跨平台和语言(反)序列化
【发布时间】:2010-11-28 03:31:54
【问题描述】:

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

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

我查看了 boost.serialize,但认为没有办法实现与 Java 的兼容性。在 Java 中继承 Serializable 也是如此。

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

提前干杯!

【问题讨论】:

标签: language-agnostic serialization cross-platform


【解决方案1】:

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

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

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

  • YAML:JSON 减去所有双引号,而是使用缩进。它更易于人类阅读,但效率可能较低,尤其是当它变得更大时。
  • BSON(二进制 JSON)
  • MessagePack(另一个压缩的 JSON)

有了这么多变体,JSON 在简单/方便和跨平台访问方面显然是赢家。在过去的几年里,随着 JavaScript 的兴起,它变得更加流行。很多人可能将其用作事实上的解决方案,而没有多加考虑(这就是我最初所做的:P)。

但是,如果大小成为问题,但您希望保持简单而不使用更高级的库之一,您可以使用 zlib(这就是我现在正在做的)或其他方式压缩 JSON跨平台算法(但这完全是另一个话题)。

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

【讨论】:

【解决方案2】:

还有 Avro。看this问题比较Apache thrift、protocol buffers、mes等。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        不幸的是,支持 ASN.1 的 Java 或 C++ 库并不多。几年前我不得不使用它,只是找不到一个好的、免费或廉价的工具来支持 C++ 中的 ASN.1。在Objective Systems,他们正在销售 ASN.1/XML 解决方案,但它非常昂贵。 (那是 C++ 和 Java 的 ASN.1 compiler!)它至少要花你一条胳膊和一条腿! (但是你将拥有一个只能用一只手使用的工具......)

        【讨论】:

        • 不错的建议,但任何昂贵的东西都是这个项目的禁忌。不过我会记住的:)
        【解决方案6】:

        我很惊讶 Jon Skeet 还没有上过这个 :-)

        Protocol Buffers 非常适合这种场景——跨语言传递结构化数据。

        也就是说,如果您按照建议的方式使用数据库,那么您真的不应该使用 Oracle 或 SQL Server 之类的全强度 RDBMS,而应该使用 Berkeley DB 之类的轻量级键值存储或其中之一许多“云表”引擎。

        【讨论】:

          【解决方案7】:

          您为什么没有选择 XML,因为这完全符合您的需求。 C++ 和 Java 都可以轻松实现。

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

          【讨论】:

          • XML 和其他人类可读的格式并不是真正的选择,因为会产生大量开销。目前,我们正在考虑在一天内将 1TB 的原始数据存储到单个磁盘。 XML 的巨大开销意味着我们无法存储所需的原始数据。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          • 1970-01-01
          • 2012-04-21
          • 1970-01-01
          • 2014-03-24
          • 2011-01-25
          • 2012-05-23
          相关资源
          最近更新 更多