我正在尝试序列化一个无法使用boost::serialization修改的自定义类,并且我需要将逻辑/计算代码与序列化部分分开。它有一些我必须序列化的受保护和私有字段,其中一些是其他类的boost::shared_ptr。
就像是:
// computational classes
class A
{
public:
A(int a) : m_val(a) {}
private:
int m_val
};
class B
{
public:
B(a) : m_ptr(new A(a)) {}
private:
boost::shared_ptr< A > m_ptr;
};
我发现一个简单的解决方法是序列化类 A,只在其定义中添加一个“朋友类”:
class A_ser;
class A
{
friend class A_ser;
//...
};
并添加一个代理类来序列化它,它引用了类 A 的字段:
class A_ser
{
public:
A_ser(A & a) : m_val(A.m_val) {}
template< class Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & m_val;
}
private:
int & m_val;
};
namespace boost {
namespace serialization {
template< class Archive >
void serialize(Archive & ar, A & a, const unsigned int version)
{
A_ser sa(a);
ar & sa;
}
} // namespace serialization
} // namespace boost
因此,当在 A 上调用序列化方法时,将使用 A_ser 的方法。
当我尝试对 B 类执行相同操作时会出现问题,因为在其反序列化中它尝试调用未定义的构造函数 A():
boost/serialization/access.hpp:132: 错误: 没有匹配函数调用'A::A()'
如果我尝试为 A 的构造函数添加一个默认参数,它只会初始化一个全新的空类。
哦,我正在使用 boost 1.53.0。
提前谢谢了。
编辑:解决方案(它是如此简单..)
只需修改 *_ser 引用
class A_ser
{
public:
A_ser(A & a) : m_a(A) {}
template< class Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & m_a.m_val;
}
private:
A & m_a;
};
并添加
template< class Archive >
void load_construct_data(Archive & /*ar*/, A * t, unsigned /*v*/)
{
::new(t) A(0);
}
问题已解决(感谢 Arun)!!