gpt4 book ai didi

boost::smart_ptr 的 C++ 非侵入式 boost 序列化

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:26 31 4
gpt4 key购买 nike

我正在尝试序列化我无法使用 boost::serialization 修改的自定义类,并且我需要将逻辑/计算代码与序列化部分分开。它有一些我必须序列化的 protected 和私有(private)字段,其中一些是其他类的 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 解决问题方法。Google 搜索 save_construct_data 和 load_construct_data 用法示例。

另请查看 Splitting serialize into Save/Load .

关于boost::smart_ptr 的 C++ 非侵入式 boost 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870024/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com