C++ C++;boost::smart\u ptr的非侵入式boost序列化
我正在尝试序列化一个无法使用boost::serialization修改的自定义类,我需要将逻辑/计算代码与序列化部分分开。 它有一些我必须序列化的受保护和私有字段,其中一些是其他类的boost::shared\u ptr 比如:C++ C++;boost::smart\u ptr的非侵入式boost序列化,c++,boost,shared-ptr,boost-serialization,C++,Boost,Shared Ptr,Boost Serialization,我正在尝试序列化一个无法使用boost::serialization修改的自定义类,我需要将逻辑/计算代码与序列化部分分开。 它有一些我必须序列化的受保护和私有字段,其中一些是其他类的boost::shared\u 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
// 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
{
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(A&A):m_val(A.m_val){}
模板<类存档>
无效序列化(存档和ar,常量未签名整数版本)
{
ar&m_val;
}
私人:
国际货币基金组织;
};
名称空间提升{
命名空间序列化{
模板<类存档>
无效序列化(存档&ar、A&A、常量未签名整数版本)
{
A_ser sa(A);
ar&sa;
}
}//命名空间序列化
}//名称空间提升
因此,当对调用序列化方法时,将使用用户的序列化方法
当我尝试对类B执行相同操作时,会出现问题,因为在其反序列化过程中,它试图调用未定义的构造函数A():
boost/serialization/access.hpp:132:错误:调用“A::A()”时没有匹配的函数
如果我尝试将默认参数放入a的构造函数,它只会初始化一个全新的空类
哦,我用的是boost 1.53.0
非常感谢
编辑:解决方案(太简单了)
只需修改*\u 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;
};
A类用户
{
公众:
A_ser(A&A):m_A(A){}
模板<类存档>
无效序列化(存档和ar,常量未签名整数版本)
{
ar&m_a.m_val;
}
私人:
A&m_A;
};
及加入
template< class Archive >
void load_construct_data(Archive & /*ar*/, A * t, unsigned /*v*/)
{
::new(t) A(0);
}
模板
无效加载构造数据(存档&/*ar*/,A*t,无符号/*v*/)
{
::新(t)A(0);
}
问题解决了(多亏了阿伦) 您可以使用这种方法解决问题。 用谷歌搜索保存构造数据和加载构造数据使用示例
还可以看一看。也许这有助于解决代理类的问题:我不能使用像
save(存档ar,常量a*a,未签名v)这样的函数。
,因为常量限定符把一切都搞糟了!
template< class Archive >
void load_construct_data(Archive & /*ar*/, A * t, unsigned /*v*/)
{
::new(t) A(0);
}