C++ 通过虚拟菱形继承,序列化可以直接工作吗?

C++ 通过虚拟菱形继承,序列化可以直接工作吗?,c++,serialization,boost,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 vir

我第一次看到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
来确保此层次结构中任何类的任何指针或引用都是所需的派生most类型:我只关心如何正确、干净地保证所有基类数据成员都正确序列化和反序列化,在序列化当前类的同时。

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

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always)
发件人:

在具有虚拟基类的菱形继承结构中,对象跟踪将防止冗余的保存/加载调用。所以这里有一个例子,可以方便地覆盖默认的跟踪特性。(注意:在未来的版本中,将重新实现默认值,以自动跟踪用作虚拟基的类)

对于基类的反序列化,请使用:

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class);
在序列化成员变量(
archive&BOOST_SERIALIZATION_NVP(variable)
)之前,请使用。对于序列化,由您处理所有涉及的成员变量


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

使用序列化可能会有点困难,因为它是一个模板类,如果您使用的是虚拟方法:@Ben我相信链接问题中的问题只涉及抽象基类(即具有纯虚拟函数的基类),因为此类类无法实例化,因此无法在此类中实例化所需的
serialize()
函数。我不相信虚拟函数会影响Boost。序列化,否则-事实上,具体来说,序列化的是数据,并且只有数据,所以我认为虚拟函数的存在本质上与Boost无关。序列化除了间接,就像在链接中的例子一样,@下面的链接似乎提供了一种支持使用抽象基类的BooSo.Services的好方法:这意味着如果我有一个指针指向一个对象,其中指针类型是多级“菱形”层次结构中间的一个类,但是该对象本身是另一个派生类-但是与此指针类型对应的类是一个多态类型(即,它至少定义了一个虚拟函数,因此有一个vtable),可以提升。序列化将正确序列化该对象,包括其最派生的类成员(即,即使指针指向基类类型)?@DanNissenbaum如果您有多态层次结构,则需要通过指向派生较少类型的指针对类进行序列化。此外,还必须反序列化为序列化的同一类型(在boost::serialization单元测试中不测试不同类型)@AnonymousCoward是
BOOST_SERIALIZATION_BASE_OBJECT_NVP
优于
BOOST::SERIALIZATION::BASE_OBJECT(*this);