我第一次看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类数据成员都被正确序列化和反序列化,以及当前被序列化的类。
答案 0 :(得分:2)
使用虚拟基类序列化对象时,必须为虚拟基类显式启用对象跟踪:
BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)
在具有虚拟基类的钻石遗传结构中,对象跟踪将阻止冗余的保存/加载调用。所以这里有一种情况可以方便地覆盖默认的跟踪特征。 (注意:在将来的版本中,将重新实现默认值以自动跟踪用作虚拟基础的类。)
对于de / serializing基类,请使用:
archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);
在使用intrusive serialization序列化成员变量(archive & BOOST_SERIALIZATION_NVP(variable)
)之前。对于non-intrusive序列化,由您来处理所涉及的所有成员变量。
所有这些都是基于这样的假设:您通过最派生类型的指针或引用来取消/序列化非多态类(使用虚拟基类)。