我正在使用 Boost 的序列化库来保存和加载应用程序的状态。这些对象依赖于 TCP 连接。现在我在对象被反序列化后将指向 TCP 连接的指针分发到对象中,但是跟踪在加载过程中创建的所有对象被证明是笨拙的。
理想情况下,我希望能够在创建对象时将 TCP 连接传递给对象,也许作为构造函数参数。我可以找到有关在序列化库中使用非默认构造函数的说明,但这些说明假设参数本身可以仅使用存档文件中存储的信息来构造。是否可以在反序列化过程中以某种方式注入预先存在的对象?
我正在使用 Boost 的序列化库来保存和加载应用程序的状态。这些对象依赖于 TCP 连接。现在我在对象被反序列化后将指向 TCP 连接的指针分发到对象中,但是跟踪在加载过程中创建的所有对象被证明是笨拙的。
理想情况下,我希望能够在创建对象时将 TCP 连接传递给对象,也许作为构造函数参数。我可以找到有关在序列化库中使用非默认构造函数的说明,但这些说明假设参数本身可以仅使用存档文件中存储的信息来构造。是否可以在反序列化过程中以某种方式注入预先存在的对象?
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;
}
您可以加载不可默认构造的对象,并通过load_construct_data
为该类定义的方式向它们传递您希望的任何参数。有关详细信息,请参阅此示例。