【问题标题】:Serializing C++ objects序列化 C++ 对象
【发布时间】:2012-09-12 00:34:12
【问题描述】:

我想实现一个序列化类,它接收一个对象并将其转换为二进制流并存储在一个文件中。稍后,应该从文件中重建对象。

虽然这个功能是由 C# 中的 BinaryFormatter 提供的,但我想设计我的 从头开始拥有自己的序列化类。

有人可以指出一些资源吗?

提前致谢

【问题讨论】:

  • 你想支持版本控制之类的东西吗?
  • 你不能。 C++ 中没有自省(也称为反射)。此工具允许创建通用序列化程序对象。没有它,您必须为每个要序列化的类添加序列化代码。
  • C++高级序列化系统的例子可以参考boost序列化库。
  • 不是很二进制,但有一个很大的讨论:stackoverflow.com/questions/1809670/… 本质上,没有直接的方法。要么使用模板魔法并自己编写一些类布局,然后 C++ 编译器将模板展开以保存/加载,要么使用代码生成器为每个类编写保存/加载代码。
  • C# 建立在 dotnet 之上,具有出色的反射和代码注释功能,这使得各种(反)序列化任务变得更加简单。尝试这样做是 C++ 中的一种通用方式,将会非常复杂。

标签: c++ serialization marshalling deserialization unmarshalling


【解决方案1】:

我想给你一个否定的答案。它不太有用,但它仍然可能有用。

多年来,我一直在使用 boost 序列化,这是我公司最大的战略错误之一。它产生非常大的输出,非常慢,它传播了一大堆依赖项,使得所有东西编译起来都非常慢,然后很难摆脱,因为你有现有的序列化格式。此外,它在不同的编译器上表现不同,因此从VS2005升级到2010实际上导致我们编写了一个兼容层,这也很难,因为代码很难理解。

【讨论】:

    【解决方案2】:

    这里有2个C++序列化的解决方案:

    我个人只有第一个经验,实际上只使用过基于文本的序列化程序,但我知道定义二进制序列化程序以与 s11n 一起使用很容易。

    【讨论】:

      【解决方案3】:

      我使用 boost::serialization 库已经有一段时间了,我认为它非常好。你只需要像这样创建序列化代码:

      class X {
        private:
          std::string value_;
        public:
          template void serialize(Archive &ar, const unsigned int version) {
             ar & value_;
           };
       }
      

      无需创建反序列化代码(这就是他们使用 & 运算符的原因)。但如果您愿意,您仍然可以使用 > 运算符。

      还可以为类编写序列化方法而无需修改(例如:如果您需要序列化来自库的对象)。在这种情况下,您应该执行以下操作:

      namespace boost { namespace serialization {
             template
             void serialize(Archive &ar, X &x const unsigned int version) {
                          ar & x.getValue();
             };
          }}
      

      【讨论】:

      • template 没有参数?这合法吗?
      【解决方案4】:

      C++ Middleware Writer 可能很有趣。它有performance advantages over the serialization library in Boost。它还可以自动创建序列化函数。

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 1970-01-01
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 1970-01-01
        • 2011-03-12
        相关资源
        最近更新 更多