Serialization 序列化多态类型初始化

Serialization 序列化多态类型初始化,serialization,boost,polymorphism,boost-serialization,Serialization,Boost,Polymorphism,Boost Serialization,我有一个基类和4个派生类。我将所有派生类存储在基类指针类型的向量中。在第一次初始化期间,我使用它们的构造函数以不同的方式创建每个派生类型。基本上,它们的构造函数中都有不同的参数类型。(我必须提供一个受保护的默认ctor以使BOOST_CLASS_导出编译,但情况不同)。我没有/无法保存这些派生类的所有成员(填入ctor) 现在,当我使用boost::serialize从磁盘加载对象时,这些成员(未序列化且特定于每个派生类型)将被销毁。而且,我想不出重新初始化这些派生类型的方法,因为我只存储基类指

我有一个基类和4个派生类。我将所有派生类存储在基类指针类型的向量中。在第一次初始化期间,我使用它们的构造函数以不同的方式创建每个派生类型。基本上,它们的构造函数中都有不同的参数类型。(我必须提供一个受保护的默认ctor以使BOOST_CLASS_导出编译,但情况不同)。我没有/无法保存这些派生类的所有成员(填入ctor)

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

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


有没有办法克服这个问题,比如一个神奇的增强或者函数调用?否则,boost::serialize的多态性根本不可能实现。。我应该遗漏了一些东西,希望我能很好地定义我的问题。

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

这样,构造函数为确保数据成员的有效性所做的任何操作都可以在序列化期间发生,并且序列化库永远不必直接操作对象的数据成员。这样可以防止数据擦除

例如,如果可以使用
名称
大小
构造类,则可以按如下方式重载函数:

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
}
模板
内联void save_construct_数据(存档&ar,常量my_class*t,常量unsigned int){
ar名称();
ar大小();
}
样板
内联无效加载构造数据(存档&ar、my_类*t、常量unsigned int){
std::字符串名;
整数大小;
ar>>名称;
ar>>尺寸;
::新建(t)my_类(名称、大小);//使用常规构造函数放置“新建”
}
查看文档