我正在寻找一种方式来序列一堆C ++结构的最便捷的方式,这样的序列化是整个C ++和Java移动(至少)和跨越32位/ 64位,大/小型平台。 要序列化的结构只包含数据,即他们没有状态或行为的纯数据对象。
这个想法是,我们序列化结构为,我们可以在数据库中存储“一般”,并在以后读出一个字节的二进制大对象。 因此,避免改变每当结构的变化,也避免了每个数据成员分配给一个领域的数据库中 - 即我们只想要一个表来保存所有的“一般”为二进制的blob。 这应该使工作少为开发人员和需要较少的变化时,结构发生变化。
我看了boost.serialize但不认为有一种方法,使与Java的兼容性。 而同样在Java继承序列化。
如果有一种方法用一个IDL文件,这将是最好的,因为我们已经有描述该结构的IDL文件开始这样做了。
干杯提前!
我很惊讶乔恩斯基特尚未扑上就这一个:-)
Protocol Buffers的是相当多专为这种情景-通过结构化数据的跨语言。
这就是说,如果你使用一个数据库,你建议的方式,你真的不应该使用全强度RDBMS如Oracle或SQL Server,而是一个轻量级的key-value存储诸如Berkeley DB的或许多之一“云表”引擎。
如果我想去真的跨语言,我通常会建议JSON,为便于JavaScript的支持和图书馆的丰富 ,以及作为人类可读和可修改(我就喜欢XML,因为我觉得它来讲较小字符,更快,更可读的)。 这不是最有效的在空间上,然而,更像一个机器可读的格式协议缓冲区或节俭本来有优势(节俭可以从IDL制成,但它也被用于编码服务方面,所以它可能是更重不是你想要的)。
我偶然在这里,有一个非常类似的问题。 6年后,这可能不是对你有用,但希望这将是给别人。
有很多的选择,可惜没有明确的赢家(虽然人们可以说,JSON是明显的赢家)。 即使谷歌已经发布了多个相互竞争的技术(所有的人显然是被内部使用的):
- FlatBuffers :这一次似乎满足从原来的问题要求, 具有有趣的基准和支持某种形式的IDL (我个人不熟悉IDL)
- Protocol Buffers的 :前面提到的。
- XFJSON :5%,比JSON小-12%。
不要忘记张贴在其他的答案中选择。 这里有更多的几个:
- YAML :JSON减去所有的双引号,但使用缩进来代替。 它更可读,但可能效率较低,特别是当它变大。
- BSON (二进制JSON)
- MessagePack (另一种压实的JSON)
有了这么多的变型中,JSON显然是简单/便利性和跨平台的访问方面的赢家。 它在过去几年已经获得了更多的人气,用JavaScript的崛起。 很多人可能使用,作为一个事实上的解决方案,没有给它多想(这是我原来:P)。
但是,如果大小成为一个问题,但你更喜欢让事情变得简单,并没有使用更先进的图书馆之一,你可以只用压缩JSON zlib
(这就是我现在正在做的),或其他一些跨平台的算法(但是这完全是另一个问题)。
要加快JSON在C ++处理,您还可以使用RapidJSON 。
你为什么不选择XML,因为这完全适合您的需求。 无论C ++和Java允许一个容易实现。
此外,我怀疑你的一切存储在数据库中的一个blob的想法,使用关系数据库中的哪些数据库已被设计为,或者切换到一些面向对象的数据库就像http://www.versant.com/en_US/products/ objectdatabase同时支持Java和C ++。
你需要ASN.1 ! (有人将此称为二进制XML)ASN.1是非常紧凑的,因此理想在两个系统之间传输数据。 而对于那些不认为这是谁用过:几家互联网协议是基于对数据序列化ASN.1模型!
不幸的是,不适用于Java或C ++,将支持ASN.1许多图书馆。 我几年前用它来工作,只是找不到一个很好的,免费或廉价的工具,以允许下ASN.1 ++的支持。 在目标体系是卖ASN.1 / XML解决方案,但它是非常昂贵的。 (该ASN.1编译器对于C ++和Java,那就是!),它的成本你一只胳膊和至少一条腿! (但你将有一个工具,你可以只用一只手用...)
我建议用保存数据的SQLite数据库。 该结构可以被存储在表中的SQLite数据库行。
生成的数据库文件是二进制在许多不同的平台兼容,并且可以存储在主数据库中的BLOB。 我相信,文件尺寸与使用相同的数据压缩的XML文件,但在加工过程中的内存使用情况将会比XML DOM显著少。
还有的Avro。 看看这个问题,对Apache节俭,协议缓冲区,MES等的比较。