我正在尝试序列化一个我无法使用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: error: no matching function for call to ‘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)!!
最佳答案 你可以用
serialize non-default-constructible objects with boost方法解决问题.
谷歌了解save_construct_data和load_construct_data用法示例.