【问题标题】:C++ boost serialization of subclass by base class pointerC++通过基类指针提升子类的序列化
【发布时间】:2018-12-13 02:03:03
【问题描述】:

我通过指向其基类的指针来执行子类对象的序列化/反序列化。一切正常,但我错过了一个功能:向正在反序列化的对象的构造函数添加运行时参数,例如:

class Base {  
public:  
    Base(AnotherClass* another)  
        :m_another(another)  
    {}  
protected:  
    AnotherClass* m_another;  
};  
class Derived : public Base {  
public:  
    Derived(AnotherClass* another)  
        :Base(another)  
    {}  
    Derived()  
        :Base(nullptr)  
    {}  
private:  
    /* different other members */  
};  
BOOST_CLASS_EXPORT(Derived);  
...  

我创建 Derived 对象的常规方法是:

Base* obj = new Derived(anotherObj);  

反序列化是这样的:

Base* obj;
ar >> obj;  

将调用默认构造函数(Derived()),并进行反序列化,但是 m_another 没有反序列化,它应该传递给构造函数,所有其他字段都被反序列化。
此外,我不能在反序列化后设置 m_another,因为它实际上会影响反序列化。
我可以通过全局变量传递对 anotherObj 的引用 - 丑陋,但有效。
有什么办法可以不那么丑陋的方式解决吗?

【问题讨论】:

    标签: c++ serialization boost deserialization boost-serialization


    【解决方案1】:

    首先,要获得类的多态行为,您需要拥有polymorphic type。这个逻辑要求是stated in the documentation

    事实证明,对象序列化的类型取决于基类(在本例中为基类)是否是多态的。如果 base 不是多态的,即没有虚函数,那么 base 类型的对象将被序列化。任何派生类中的信息都将丢失。如果这是所希望的(通常不是),则不需要其他任何努力。

    如果基类是多态的,将序列化一个最派生类型的对象(在这种情况下是derived_one 或derived_two)。要序列化哪种类型的对象的问题(几乎)由库自动处理。

    [...]

    执行此操作的明显方法是使用虚拟析构函数 (When to use virtual destructors?)。


    接下来,要使用非默认构造函数(反)序列化类型,请使用save_construct_data/load_construct_data。同样,docs 是一个好的开始。

    【讨论】:

    • 类是多态的,谢谢!问题是 load_construct_data() 反序列化传递给构造函数的参数,而我需要运行时参数。
    • 嗯。那么,您明确想要注入存档中不存在的数据吗?为什么在save_construct_data 中序列化m_another 会有问题?带有别名检测的对象跟踪将自动完成其余的工作。我建议创建一个独立的示例来展示你拥有什么,以及你希望发生什么。
    • 这是一个问题,因为(在我的例子中)m_another 是一个指向包含被反序列化对象的对象的指针。所以(在我的情况下)m_another 被更早地反序列化,我所需要的只是将指针传递给 m_another
    • 所以?我已经回答过了。你是想说服我,不,你的问题很难或无法解决吗?你倒霉了,因为这个网站是关于分享解决方案的,而不仅仅是问题。
    • 展示你所拥有的会有所帮助。所以如果没有,让我举一些可能对你有帮助的例子:Object tracking just works。会稍微麻烦一点with friend declarations if m_another is protected.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2015-01-13
    • 2012-11-09
    • 2016-10-27
    相关资源
    最近更新 更多