将 Boost.Serialization 直接与虚拟钻石继承一起工作
Will Boost.Serialization work straightforwardly with virtual diamond inheritance?
我是第一次查看 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)
从对象跟踪:
在具有虚拟基类的钻石遗传结构中,对象跟踪将防止冗余的保存/加载调用。因此,这里有一种情况,可以方便地覆盖默认跟踪特征。(注意:在未来的版本中,将重新实现默认值以自动跟踪用作虚拟基础的类)。
对于取消/序列化基类,请使用:
archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);
在序列化成员变量(archive & BOOST_SERIALIZATION_NVP(variable)
)之前,使用侵入式序列化。对于非侵入式序列化,由您来处理所涉及的所有成员变量。
所有这些都基于以下假设:通过派生最多的类型的指针或引用来反序列化非多态类(具有虚拟基类)。
相关文章:
- 钻石继承虚拟成员铸造与指针
- 接口的钻石继承(C++)
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- C++解决没有虚拟继承的钻石继承问题
- 如何调用所有基本类的复制构造函数,以在C 中复制钻石继承中最派生的类对象
- 假设钻石继承打破了C++的封装是否正确?
- C++多个钻石继承和纯虚函数
- 首选钻石继承中一个类的变量
- 钻石继承,C++ 处理
- 将 Boost.Serialization 直接与虚拟钻石继承一起工作
- 钻石继承最低基类构造函数
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- C++ "triangle"(而非钻石)继承
- 让钻石继承发挥作用,但Eclipse仍然抱怨
- 钻石继承与提升::绑定
- 为什么不使用只有一个虚拟继承的钻石继承呢
- 使用 Windows V2 凭据提供程序的钻石继承
- c++虚拟/非虚拟钻石继承
- 带有混合继承修饰符(protected/private/public)的钻石继承
- 避免钻石继承