可以将现有对象传递给Boost.Serialization加载吗?

时间:2013-05-22 22:01:56

标签: c++ serialization boost

我正在使用Boost的序列化库来保存和加载应用程序的状态。对象依赖于TCP连接。现在我在反序列化后将一个指向TCP连接的指针分配到对象中,但是跟踪在加载过程中创建的所有对象被证明是不实用的。

理想情况下,我希望能够在创建对象时将TCP连接传递给对象,可能作为构造函数参数。我可以找到关于在序列化库中使用非默认构造函数的说明,但是这些假设可以仅使用存档文件中存储的信息来构造参数本身。是否有可能以某种方式在反序列化过程中注入预先存在的对象?

2 个答案:

答案 0 :(得分:0)

您可以加载非默认构造对象,并通过为该类定义load_construct_data来传递任何您想要的参数。有关详细信息,请参阅this example

答案 1 :(得分:0)

最后,我使用boost::archive::text_iarchive作为基类创建了一个新的存档类,如下所示:

struct my_iarchive : public boost::archive::text_iarchive {
    my_iarchive(std::istream& is, socket* sock) :
        boost::archive::text_iarchive(is), sock(sock) {}

    socket* sock;
};

然后,在反序列化方法中,我们可以通过将存档转换为my_iarchive来获取用户数据。

template <class Archive>
void load(Archive& ar, const unsigned int version)
{
    m_socket = (static_cast<my_iarchive&>(ar)).sock;
}