Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过基类指针提升子类的序列化_C++_Serialization_Boost_Deserialization_Boost Serialization - Fatal编程技术网

C++ C++;通过基类指针提升子类的序列化

C++ C++;通过基类指针提升子类的序列化,c++,serialization,boost,deserialization,boost-serialization,C++,Serialization,Boost,Deserialization,Boost Serialization,我通过指向其基类的指针来执行子类对象的序列化/反序列化。一切正常,但我错过了一个功能:向反序列化对象的构造函数添加运行时参数,例如: class Base { public: Base(AnotherClass* another) :m_another(another) {} protected: AnotherClass* m_another; }; class Derived : public Base { publ

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

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);  
...  
我创建派生对象的常规方法是:

Base* obj = new Derived(anotherObj);  
反序列化过程如下所示:

Base* obj;
ar >> obj;  
将调用默认构造函数(派生()),并进行反序列化,但m_另一个未反序列化,应将其传递给构造函数,所有其他字段均反序列化。
此外,我不能在反序列化之后设置另一个m_,因为它实际上会影响反序列化。
我可以通过一个全局变量传递对另一个对象的引用-丑陋,但有效。

有没有办法以一种不那么丑陋的方式来解决这个问题呢?

首先,要获得类的多态行为,你需要一个。这一逻辑要求是:

结果表明,序列化对象的类型取决于基类(在本例中为基类)是否为polymophic。若base不是多态的,也就是说,若它并没有虚函数,那个么base类型的对象将被序列化。任何派生类中的信息都将丢失。如果这是所需的(通常不是),则无需其他努力

如果基类是多态的,则派生类型最多的对象(在本例中为派生类型1或派生类型2)将被序列化。要序列化哪种类型的对象的问题(几乎)由库自动处理

[……]

实现这一点的明显方法是使用虚拟析构函数()



接下来,要使用非默认构造函数(反)序列化类型,请使用
保存构造数据
/
加载构造数据
。同样,这是一个好的开始。

这个类是多态的,谢谢!问题是load_construct_data()反序列化传递给构造函数的参数,而我需要runtime param.Huh。那么,您是否明确希望注入存档中不存在的数据?为什么在
save\u-construct\u-data
中序列化
m\u-other
会有问题?使用别名检测的对象跟踪将自动完成其余工作。我建议创建一个自包含的示例,展示您所拥有的以及希望发生的情况。这是一个问题,因为(在我的例子中)m_other是指向包含反序列化对象的对象的指针。所以(在我的例子中)m_-other在前面被反序列化,我所需要的就是将指针传递给m_-other.So?我已经回答了。你是想让我相信,不,你的问题很难解决还是无法解决?你运气不好,因为这个网站是关于分享解决方案的,而不仅仅是问题。展示你所拥有的将会有所帮助。所以,在并没有这些的情况下,让我来举一些可能对你们有帮助的例子:。这会稍微麻烦一些。