boost :: serialization多态类型初始化

时间:2010-11-18 22:35:08

标签: serialization boost polymorphism boost-serialization

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

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

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

有没有办法克服这个问题,可能是魔术助推定义或函数调用?否则,使用boost :: serialize的多态性是不可能的......我应该错过一些东西,希望我能够很好地定义我的问题。

1 个答案:

答案 0 :(得分:0)

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

这样,无论您的构造函数如何确保数据成员的有效性也可以在序列化期间发生,并且序列化库永远不必直接操作对象的数据成员。这应该可以防止数据擦除。

例如,如果您的类可以使用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