Will Boost.Serialization可以直接使用虚拟钻石继承吗?

Dan*_*aum 6 c++ serialization boost

我是第一次看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; }
Run Code Online (Sandbox Code Playgroud)

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

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

Ano*_*ard 2

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

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)
Run Code Online (Sandbox Code Playgroud)

对象跟踪

在具有虚拟基类的菱形继承结构中,对象跟踪将防止冗余的保存/加载调用。因此,在这种情况下,覆盖默认跟踪特征可能会很方便。(注意:在未来的版本中,默认值将被重新实现,以自动跟踪用作虚拟基础的类)。

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

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);
Run Code Online (Sandbox Code Playgroud)

在使用侵入式序列化来序列化成员变量 ( archive & BOOST_SERIALIZATION_NVP(variable))之前。对于非侵入式序列化,您需要处理涉及的所有成员变量。

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