c++ - 易于使用的可扩展序列化/编码?

标签 c++ serialization marshalling thrift asn.1

我对数据结构的序列化有疑问。数据结构的序列化有很多可能性(也称为ma​​rshallingdeflating,参见wiki-article)。每一种编程语言、框架、标准或库似乎都有自己的序列化方法。许多人还定义了自己的数据/接口(interface)描述语言(我更喜欢只在代码内部定义的语言依赖数据结构)。仅举几例(参见 wiki-article):COM IDL、CORBA IDL、Thrift IDL、google Protocol Buffer “.proto”、XSD、ASN.1 IDL 等。其中一些序列化能够生成语言 native 数据结构和用于序列化和反序列化这些结构的代码。

我对这个问题做了一些研究,但我还没有决定。所以我的问题是: 我应该使用哪种序列化?

我的要求:可扩展性、空间效率(至少二进制)、高效的数据访问、易用性(可能使用生成的代码以及 getter 和 setter)和 c++ -兼容性。

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

有什么建议吗?如果您能推荐有关该主题的更多阅读 Material ,我们也将不胜感激。

--- 编辑 ---

1) boost::serialization 似乎很流行。 它有一些非常好的功能,文档非常好, ant 的语法似乎很简单。也许我有点挑剔,但有些事情我不喜欢:我看不出它如何处理前向兼容性(参见 4)。我更喜欢生成的代码。

2) google protobuf 似乎更符合我的需求,但我还没有深入研究它们。它们似乎可以很好地处理向前和向后的兼容性(参见 5)。他们有针对不同语言的代码生成器,并且开发人员知道非常相似的概念,例如(参见 FAQ)。我将更深入地研究 protobufs。

3) 振奋精神似乎不是我搜索的东西。

最佳答案

Boost::serialize 很棒

  • 支持不同版本的存档
  • 对大多数数据结构(指针、 vector ...)的良好支持
  • 非常快(1Gb 需要 10 秒,所以限制是您的硬盘驱动器)
  • 相当容易使用
  • 如果与 boost::iostreams 一起使用,则进行动态压缩

缺点是:

  • 存档可能不兼容从一个平台到另一个平台
  • 只针对C++,不与其他语言交流

Google 的 Protocol Buffers 是一个不错的替代方案,它正在成长 http://code.google.com/p/protobuf/

  • 语言独立
  • 版本支持
  • 很快

因此,如果您想在不同系统之间交换数据,我会选择 Protocol Buffers。但是,如果您只有一个应用程序,我会使用 boost::serialize

关于c++ - 易于使用的可扩展序列化/编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5112026/

相关文章:

json - Swift JSON 序列化类型不匹配

c# - 从 C 函数编码 LPWSTR *

c++ - 如何编写条件计数器代码?

c++ - `print` 具有两个不同构造函数的对象的函数

c++ - 如何使用 nlohmann json 在 C++ 中将相同的关键 json 数据合并为一个

c++ - 模板的前向声明

java - 在 Java 中序列化对象时出现 StackOverflowError

python - 在 Python 中序列化 float 安全吗?

c# - 使用 LayoutKind.Explicit 进行 boolean 编码,这是按设计损坏还是失败?

c# - 如何在 C# 中使用 struct 和 union