【问题标题】:C++ non intrusive boost serialization of a boost::smart_ptrboost::smart_ptr 的 C++ 非侵入式 boost 序列化
【发布时间】:2013-04-08 01:44:31
【问题描述】:

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

【问题讨论】:

  • 问题出在代理类的事情上:我不能使用像 save(Archive ar, const A * a, unsigned v) 这样的函数,因为 const 限定符把一切都搞砸了!

标签: c++ boost shared-ptr boost-serialization


【解决方案1】:

您可以使用serialize non-default-constructible objects with boost 方法解决问题。 谷歌搜索 save_construct_data 和 load_construct_data 使用示例。

也可以看看Splitting serialize into Save/Load。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多