【问题标题】:Will Boost.Serialization work straightforwardly with virtual diamond inheritance?Boost.Serialization 会直接与虚拟钻石继承一起工作吗?
【发布时间】:2012-11-07 00:20:17
【问题描述】:

我是第一次看 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 -class 数据成员与被序列化的当前类一起正确序列化和反序列化。

【问题讨论】:

  • 如果你使用的是虚拟方法,你可能在使用序列化时会遇到一些麻烦,因为它是一个模板类:stackoverflow.com/questions/10490245/…
  • @Ben 我相信链接问题中的问题仅与 abstract 基类(即具有 pure 虚函数的基类)有关,因为这样的类不能被实例化,因此不可能在这样的类中实例化所需的serialize() 函数。我不相信虚函数会影响 Boost.Serialization - 事实上,它是特定的数据,并且只有数据,是序列化的,所以我认为虚函数的存在本质上与 Boost.Serialization 无关,除非是间接的,如链接中的示例所示。
  • @Ben 以下链接似乎提供了一种将 Boost.Serialization 与抽象基类一起使用的受良好支持的方法:stackoverflow.com/questions/1332602/…

标签: c++ serialization boost


【解决方案1】:

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

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

来自object tracking

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

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

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);

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

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

【讨论】:

  • 这是否意味着如果我有一个指向对象的指针,该对象的指针类型是位于多级“菱形”层次结构中间的类的类型,但该对象本身是更进一步的派生类 - 但与此指针类型对应的类IS 是一种多态类型(即,它至少定义了一个虚函数,因此具有一个 vtable),Boost.Serialization 将正确序列化对象,包括所有直到它的最派生类成员(即即使指针指向基类类型)?
  • @DanNissenbaum 如果你有一个多态层次结构,你需要export or register 类通过指向较少派生类型的指针进行序列化。此外,您必须反序列化为您序列化的相同类型(在 boost::serialization 单元测试中未测试不同类型)。
  • @AnonymousCoward 是BOOST_SERIALIZATION_BASE_OBJECT_NVP 优先于boost::serialization::base_object<base_class_of_T>(*this); 吗?
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2012-11-05
  • 2017-12-09
  • 2011-02-09
相关资源
最近更新 更多