【问题标题】:boost::serialization polymorphic type initializationboost::serialization 多态类型初始化
【发布时间】:2011-05-12 08:14:05
【问题描述】:

我有一个基类和 4 个派生类。我将所有派生类存储在基类指针类型的向量中。在第一次初始化期间,我使用它们的构造函数以不同的方式创建每个派生类型。基本上,他们每个人的 ctor 中都有不同的参数类型。 (我必须提供一个受保护的默认 ctor 才能使 BOOST_CLASS_EXPORT 编译,但这是另一回事)。我不/不能保存这些派生类的所有成员(用 ctor 填写)。

现在,当我使用 boost::serialize 从磁盘加载对象时,这些成员(未序列化且特定于每个派生类型)被销毁。而且,我想不出重新初始化这些派生类型的方法,因为我只存储基类指针。

我真正需要的是能够部分加载我的派生类型(指针),而不删除它们的所有内容..

有没有办法克服这个问题,也许是一个神奇的提升定义或函数调用?否则,根本不可能使用 boost::serialize 进行多态性。我应该遗漏一些东西,希望我能足够好地定义我的问题。

【问题讨论】:

    标签: serialization boost polymorphism boost-serialization


    【解决方案1】:

    您不需要为序列化创建默认构造函数。您可以改为让 boost 保存/加载非默认构造函数所需的数据,并在加载时使用它来构造新对象。

    这样,无论你的构造函数做什么来确保数据成员的有效性也可以在序列化过程中发生,序列化库永远不必直接操作对象的数据成员。这应该可以防止数据被擦除。

    例如,如果您的类可以使用namesize 构造,您可以按如下方式重载函数:

    template <class Archive>
    inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) {
        ar << my_class->name();
        ar << my_class->size();
    }
    
    template<class Archive>
    inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) {
        std::string name;
        int size;
        ar >> name;
        ar >> size;
        ::new(t)my_class(name, size); // placement 'new' using your regular constructor
    }
    

    查看文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2020-01-31
      • 2010-11-29
      相关资源
      最近更新 更多