gpt4 book ai didi

c++ - Boost.Serialization 会直接与虚拟菱形继承(钻石问题)一起工作吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:04 25 4
gpt4 key购买 nike

我是第一次看 Boost.Serialization,我找不到关于虚拟菱形继承(钻石问题)结构序列化的明确评估(或说明)。

考虑以下类层次结构:

class A { int a; }

class B1 : public virtual A { int b1; }

class B2 : public virtual A { int b2; }

class B3 : public virtual A { int b3; }

class C12 : public virtual B1, public virtual B2 { int c12; }

class C13 : public virtual B1, public virtual B3 { int c13; }

class C23 : public virtual B2, public virtual B3 { int c23; }

class D123 : public virtual C12, public virtual C13, public virtual C23 { int d123; }

使用 Boost.Serialization 在所有这些类中实现序列化的正确(希望是简单)方法是什么?

注意:没有需要序列化的指针或引用类成员。另请注意:我很乐意使用 dynamic_cast<>确保指向此层次结构中任何类的任何指针或引用都是所需的、派生最多的类型:我只是关心如何正确、干净地保证所有 BASE 类数据成员都被正确序列化和反序列化,连同正在序列化的当前类。

最佳答案

当使用虚拟基类序列化对象时,您必须显式地为虚拟基类启用对象跟踪:

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)

来自 object tracking :

In a diamond heritance structure with a virtual base class, object tracking will prevent redundant save/load invocations. So here is one case where it might be convenient to override the default tracking trait. (Note: in a future version the default will be reimplemented to automatically track classes used as virtual bases).

至于反序列化基类,使用:

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);

在使用 intrusive serialization 序列化成员变量 (archive & BOOST_SERIALIZATION_NVP(variable)) 之前.对于 non-intrusive序列化由您来处理所有涉及的成员变量。

所有这一切都基于以下假设:您通过最派生类型的指针或引用反序列化非多态类(具有虚拟基类)。

关于c++ - Boost.Serialization 会直接与虚拟菱形继承(钻石问题)一起工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com