【问题标题】:Deserialize object with references and no default constructor (boost::serialization)反序列化具有引用且没有默认构造函数的对象(boost::serialization)
【发布时间】:2011-02-08 19:37:44
【问题描述】:

是否可以在 boost::serialization 库中反序列化(多态)具有引用且没有默认构造函数的对象?

class Example
{
    int& value;

public:

    Example(int _value): value(_value) {}
    virtual ~Example() {}

    friend class boost::serialization::access;
    template<typename Archive>
    void serialize(Archive & ar, const unsigned int file_version)
    {
        ar & value;
    }
};

class Usage
{
    Example* example;

public:

    Usage(): example(new Example(123)) {}
    ~Usage() { delete example; }

    friend class boost::serialization::access;
    template<typename Archive>
    void serialize(Archive & ar, const unsigned int file_version)
    {
        ar & example;
    }
};

...

// serialize and deserialize object with reference and no default constructor
{
    Usage source;

    std::ostringstream oss;
    boost::archive::text_oarchive oa(oss);
    oa & source;

    Usage target;

    std::istringstream iss(oss.str());
    boost::archive::text_iarchive ia(iss);
    ia & target; // does not compile
}

【问题讨论】:

    标签: c++ serialization boost reference default-constructor


    【解决方案1】:

    至于非默认可构造对象,我建议查看该项目 非默认构造函数 here.
    您的课程可以通过以下方式序列化 编写自己的函数模板load_construct_datasave_construct_data

    【讨论】:

    • 这些函数有一个非常烦人的不对称性,对吧?也就是说,如果您使用load_construct_datasave_construct_data,您会将一些数据放入/从存档中获取,然后这些函数都调用serialize(),这可能会向/从存档中放入/获取更多数据.但是,如果您尝试序列化一个对象(不是指针),它将只使用serialize(),然后不会放入/获取所有数据,因为它从不调用save/load_construct_data。你明白我的意思吗?
    • @DavidDoria:你的意思是serialize 会在load_construct_data 内部被调用吗?如果我理解正确,serialize 会在 load_construct_data 完成后调用。 load_construct_data 仅加载构造类所需的数据(答案中链接的文档中的m_attribute),serialize 加载除这些之外的数据(文档中的m_state)。
    • 是的,这就是我的意思。问题是这迫使序列化只适用于指针类型。也就是说,如果我们做Test测试; outArchive > readTest;) 它将不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2018-08-18
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多