2011-02-24 31 views
6

我有一个问题关于serializaton数据结构。数据结构的序列化有很多种可能(也称为编组缩减,参见wiki-article)。每种编程语言,框架,标准或库似乎都带有自己的序列化方法。许多人还定义了他们自己的数据/接口描述语言(我更喜欢仅在代码内定义的语言依赖数据结构)。只是仅举几例(见wiki-article):COM IDL,CORBA IDL,节俭IDL,谷歌协议缓冲 “.proto”,XSD,ASN.1 IDL,等等。其中一些序列化能够生成语言原生数据结构和用于序列化和反序列化这些结构的代码。易于使用的可扩展序列化/编组?

我做了关于这个问题的一些研究,但我仍然未定。所以我的问题是: 我应该使用哪种序列化?

我要求扩展,空间效率(至少二进制),高效地访问数据,安心使用(可能与所生成的代码和吸气剂和setter)和C++ - 保持兼容。

可扩展性应提供向前和向后兼容性。更具体地说,我写的数据格式通常会随着时间的推移而增长,因为我添加了新的数据字段,这在开发之初我无法预见。现在,我希望能够使用较新的软件版本读取过时格式的存储数据,旧的存储数据中找不到的数据字段可以使用默认值或其他值填充。另一方面,我希望能够读取使用新描述书写的数据。未知数据字段应该被用“旧”数据描述编译的软件忽略(可能会产生一些警告)。

任何推荐?关于该主题的进一步阅读推荐,也将不胜感激。

---编辑---

1)的boost ::序列化似乎是相当受欢迎的。 它有一些非常好的功能,文档非常好,谚语似乎很直截了当。也许我有点挑剔,但也有一些我不喜欢的东西:我不明白它如何处理向前兼容(见4)。我宁愿生成的代码。

2)谷歌protobuf似乎适合我的需要更好,但我没有看着他们的深度。他们似乎很好地处理向前和向后的可塑性(参见5)。他们有用于不同语言的代码生成器,开发人员知道类似的概念(请参阅FAQ)。我将深入研究protobufs。

3)提升精神似乎并没有成为我寻找的东西。

+0

是的,不幸的是前向兼容性缺乏boost :: serialization。另外,在以前的boost :: serialization版本中,我在Mac和PC上生成的XML文件中遇到了一些细微的差异,所以对于该格式的完美兼容性也存在疑问。挖掘Protobuf听起来像是最好的主意,请告诉它走向何方。 – 2011-03-01 18:59:58

回答

2

我使用了boost的序列化库一段时间 - 它的可扩展性好,效率高,并支持对每个要序列化的对象进行单独的版本控制。所有这些特征当然意味着它是一个复杂的野兽,需要一些时间才能正确地学习。没有那么灵活的编译。如果你试图把它带到一个没有官方支持的平台上,那么期望调试一些非常复杂的代码。各平台之间的文件兼容性可能会稍微差一点,并且向前兼容性将不起作用。总的来说,如果您需要应用程序实例彼此通信,boost序列化通常不是一个好的选择。不过,对于正确的项目来说并不是那么糟糕。

http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/index.html

加速也有一个更通用的解析/输出较新的精神库,但我还没有使用它,并不会推荐它基于第一印象 - 它需要一些挖掘,甚至明白什么特别命名的图书馆是为了。最后,对于简单的项目来说,滚动你自己的序列化库也许不是一个不错的选择 - 它不是太难,你会得到你需要的功能。有点令人失望的是,C++世界似乎还没有充分解决序列化问题,但这是我上一次决定序列化功能时得出的结论。不过,在一段时间内使用boost的序列化提供了一个很好的想法,即在我自己的实现中应该瞄准什么。

+0

用于boost :: serialize的+1。 Boost :: spirit用于解析语法。所以你可以使用它来进行序列化,但它会很慢并且很难维护。 – 2011-02-25 12:44:58

+0

是的,我刚刚听到一些模糊的引用,指出精灵被用于序列化 - 但是,它可能不是正确的工具。 – 2011-02-25 13:27:13

+0

谢谢你的回答。我之前听说过boost :: serializaton,但没有深入研究它,现在我会做。也许这对我来说是正确的。 – Metaprogger 2011-02-25 18:13:30

2

的boost ::序列化是伟大

  • 支持不同版本的存档
  • 的良好支持大多数的数据结构(指针,向量...)
  • 非常快(10秒1GB的这样的限制是您的硬盘驱动器)
  • 相当容易,如果与升压用惯
  • 在实时压缩:: iostreams的

的缺点是:

  • 存档可能无法从一个。平台兼容到其他
  • 仅适用于C++,与其他语言

仍保持增长一个不错的选择没有交流,是来自Google的协议缓冲区http://code.google.com/p/protobuf/

  • 与语言无关
  • 版本支持
  • 非常快

所以,如果你想不同的系统之间交换数据,我会去与Protocol Buffers的。但是,如果你有一个单一的应用程序,我会使用boost :: serialize

+0

谢谢你的回答。我可能会有多个应用程序通过网络进行通信,是boost :: serialize不适合呢? – Metaprogger 2011-02-25 18:26:21

+0

Boost :: serialize具有许多格式,如二进制,文本或XML。如果您使用文本或XML,则不会有任何问题。但是,二进制可能是一个问题。 – 2011-02-25 19:54:43