Language agnostic 跨平台和语言(反)序列化 我正在寻找一种方法,以最方便的方式串行化一系列C++结构,使串行化在C++和java之间(至少是最小的)和跨32位/64位、大/小的Endiad平台是可移植的。要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象

Language agnostic 跨平台和语言(反)序列化 我正在寻找一种方法,以最方便的方式串行化一系列C++结构,使串行化在C++和java之间(至少是最小的)和跨32位/64位、大/小的Endiad平台是可移植的。要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象,language-agnostic,serialization,cross-platform,Language Agnostic,Serialization,Cross Platform,我们的想法是将结构序列化为一个八进制blob,我们可以“一般”地将其存储在数据库中,并在以后读取。因此,避免在结构发生更改时更改数据库,也避免将每个数据成员分配给一个字段——即,我们只希望一个表将所有内容“一般”保存为二进制blob。这将减少开发人员的工作量,并在结构更改时减少所需的更改 我已经看过boost.serialize,但不认为有办法实现与Java的兼容性。同样,在Java中继承Serializable也是如此 如果有一种方法可以做到这一点,最好从一个IDL文件开始,因为我们已经有了描

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

我已经看过boost.serialize,但不认为有办法实现与Java的兼容性。同样,在Java中继承Serializable也是如此

如果有一种方法可以做到这一点,最好从一个IDL文件开始,因为我们已经有了描述结构的IDL文件


提前干杯

为什么不选择XML,因为它完全符合您的需求。C++和java都允许实现。


<> P>此外,我怀疑你把所有东西都存储在数据库中,使用一个数据库设计的关系数据库,或者切换到支持java和C++的面向对象数据库。

< p>我很惊讶乔恩?斯皮特还没有攻克这一个:——) 基本上是为这种场景设计的——跨语言传递结构化数据

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

你需要!ASN.1非常紧凑,因此非常适合在两个系统之间传输数据。对于那些认为这一点从未被使用过的人来说:有几种互联网协议基于ASN.1模型进行数据序列化


<>不幸的是,没有太多的java或C++库可以支持ASN 1。几年前我不得不与它合作,只是找不到一个好的、免费的或便宜的工具来支持C++中的ASN 1。目前,他们正在销售ASN.1/XML解决方案,但价格非常昂贵。(对于C++和java,就是这样),至少要花你一大笔钱!(但是你会有一个只需一只手就可以使用的工具…

如果我想真正跨语言,我通常会建议使用JSON,因为它易于javascript支持和修改,并且是人类可读和可修改的(我更喜欢它,因为我发现它在字符方面更小、更快、更可读)。然而,就空间而言,它并不是最有效的,而且一种更具机器可读性的格式也有其优点(可以使用IDL进行节俭,但它也用于编码服务,因此它可能比您想要的更重)。

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


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

还有Avro。查看Apache thrift、协议缓冲区、mes等的比较问题。

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

有很多选择,不幸的是没有明确的赢家(尽管有人可能会说JSON是明确的赢家)。甚至谷歌也发布了多种相互竞争的技术(所有这些技术显然都在内部使用):

  • :这个似乎符合原始问题的要求,并且(我个人不熟悉IDL)
  • :前面提到过
  • :比JSON小5%-12%
别忘了其他答案中的备选方案。这里还有一些:

  • :JSON减去所有双引号,但改用缩进。它的可读性更强,但效率可能更低,尤其是当它变得更大时
  • (二进制JSON)
  • (另一个例子)
有如此多的变体,JSON在简单性/便利性和跨平台访问方面显然是赢家。随着JavaScript的兴起,它在过去几年中变得更加流行。很多人可能把它作为事实上的解决方案,而没有考虑太多(这就是我最初做的:P)

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


<>为了加快C++中的JSON处理,你也可以使用.< /p> XML和其他人类可读格式,这不是因为创建的开销量。目前,我们正在考虑在一天之内将1TB的原始数据存储到一个磁盘上。XML的巨大开销意味着我们无法存储所需的原始数据。这是一个不错的建议,但任何昂贵的东西都是这个项目的禁忌。不过我会记住:)看看它是跨平台和多语言的。请注意,压缩可以节省空间和带宽。