【发布时间】:2017-09-11 15:05:36
【问题描述】:
假设以下简化代码:
父类
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/unique_ptr.hpp>
class Parent
{
public:
Parent();
...
private:
// boost serialization
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & *m_child;
}
std::unique_ptr<Child> m_child;
}
Parent::Parent()
{
...
m_child = std::unique_ptr<Child>(new Child(this));
}
儿童班
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/unique_ptr.hpp>
class Child
{
public:
Child(Parent * parent)
{
m_parent = parent;
};
...
private:
// boost serialization
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & m_parent;
}
Child(){};
Parent m_parent{ nullptr };
}
我的父类创建了一个子类,并将一个指针传递给子类存储的自身。 归档父类时,它归档将指针归档到父类的子类。 恢复父类时,它会创建子类并同时恢复它。我的问题是这样的:
子类中的指针是否会正确恢复,从而保证指向它的父类?
这似乎可以工作,我通过调试器单步执行并将父级的 this 指针的值与子级的 m_parent 进行比较来验证这一点。但是,我无法弄清楚 boost 是如何实现这一点的,这让我想知道我是否只是“走运”。任何人都可以验证 boost 序列化是否足够聪明以维护 child::m_parent->parent 关系?
或者我应该采取额外的步骤,不存档指针并在加载对象后设置它?
【问题讨论】:
-
对不起,错字,应该是:Parent * m_parent{nullptr};
标签: serialization boost