我对数据结构的 serializaton 有疑问。数据结构序列化有许多可能性(也称为编组或缩小,请参阅wiki-article)。每种编程语言,框架,标准或库似乎都带有自己的序列化方法。许多人还定义了他们自己的数据/接口描述语言(我更喜欢语言依赖于仅在代码内部定义的数据结构)。仅举几例(参见wiki-article):COM IDL,CORBA IDL,Thrift IDL,谷歌协议缓冲区“.proto”,XSD,ASN.1 IDL等。其中一些序列化能够生成语言本机数据结构和代码,用于序列化和反序列化这些结构。
我对这个问题进行了一些研究,但我还是未定。所以我的问题是: 我应该使用哪种序列化?
我的要求:可扩展性,空间效率(至少是二进制),高效的数据访问,易于使用(可能使用生成的代码和getter和setter)和c ++ -compability。
可扩展性应提供前向和后向兼容性。更具体地说,我写的数据格式通常会随着时间的推移而增长,因为我添加了新的数据字段,这在开发开始时是无法预见的。现在我希望能够使用较新的软件版本从过时的格式读取存储的数据,旧的存储数据中找不到的数据字段可以用默认值或其他东西填充。另一方面,我希望能够读取用新描述写的数据。然后,应使用“旧”数据描述编译的软件忽略未知数据字段(可能会产生一些警告)。
是否有任何重组?对此主题的进一步阅读建议也将不胜感激。
---编辑---
1)boost :: serialization似乎很受欢迎。 它有一些非常好的功能,文档非常好, 蚂蚁的语法似乎很直接。也许我有点挑剔,但有一些我不喜欢的东西:我看不出它如何处理前向兼容性(见4)。我更喜欢生成代码。
2)谷歌protobuf似乎更符合我的需求,但我没有深入研究它们的深度。他们似乎很好地处理前向和后向兼容性(见5)。他们有不同语言的代码生成器,开发人员也知道非常相似的概念(参见FAQ)。我将深入了解protobufs。3)提升精神似乎不是我搜索的东西。
答案 0 :(得分:2)
我使用了boost的序列化库一段时间了 - 它可以扩展,所有权利,高效,并支持您序列化的每个对象的单独版本控制。所有这些功能当然意味着它是一个复杂的野兽,需要一些时间才能正确学习。编译也不是那么活泼。如果你试图将它带到一个非官方支持的平台,那么期望调试一些非常复杂的代码。跨平台的文件兼容性可能略微不稳定,并且前向兼容性不起作用。总的来说,如果您需要相互通信的应用程序实例,则升级序列化通常不是一个好的选择。不过,对于正确的项目来说,这并不是那么糟糕。
http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/index.html
Boost还有更新的Spirit库,用于更通用的解析/输出,但我没有使用它,也不会根据第一印象推荐它 - 需要一些挖掘才能理解特殊命名库的含义
最后,对于更简单的项目来说,滚动自己的序列化库可能也不是一个糟糕的选择 - 它不是太难,你可以获得所需的功能。令人失望的是,C ++世界似乎仍然没有充分解决序列化,但这是我上次必须决定序列化功能时得出的结论。暂时使用boost的序列化很好地了解了我自己实现的目标。
答案 1 :(得分:2)
Boost :: serialize很棒
缺点是:
一个不错的替代方案是来自Google http://code.google.com/p/protobuf/
的协议缓冲区因此,如果您想在不同系统之间交换数据,我会使用Protocol Buffers。但是如果你有一个应用程序,我会使用boost :: serialize