首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::序列化多态类型初始化

boost::序列化多态类型初始化
EN

Stack Overflow用户
提问于 2010-11-19 06:35:08
回答 1查看 715关注 0票数 0

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-10 06:07:00

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

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

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4220321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档