C++ C++;boost::smart\u ptr的非侵入式boost序列化

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

我正在尝试序列化一个无法使用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(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);
}