2012-11-19 25 views
6

我在第一次看到Boost.Serialization,並且我無法找到關於虛擬鑽石繼承結構序列化的明確評估(或指令)。Will 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

使用序列化可能會有點麻煩,因爲它是一個模板類,如果您使用的是虛擬方法:http://stackoverflow.com/questions/10490245/virtual-functions-and-template-clash –

+0

@Ben我相信鏈接問題中的問題僅適用於* abstract *基類(即具有* pure *虛函數的基類),因爲這些類不能實例化,因此不可能實例化所需的'serialize()在這樣一個班級內的功能。我不相信虛擬函數會影響Boost.Serialization - 事實上,它只是數據和數據,它們是序列化的,所以我認爲虛擬函數的存在本質上與Boost.Serialization無關,除非是間接的,如鏈接中的示例所示。 –

+0

@Ben下面的鏈接似乎呈現給使用Boost.Serialization與抽象基類一個很好的支持方式:http://stackoverflow.com/questions/1332602/how-to-serialize-derived-template-classes-with- boost-serialize –

回答

2

序列化一個有虛基類對象,你必須明確地啓用對象跟蹤了當前虛擬基類:

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序列化,由您來處理所有涉及的成員變量。

所有這些都基於通過最派生類型的指針或引用您DE /串行化非多態性類(虛基類)的假設。

+0

這是否意味着如果我有一個指針指向一個對象,其指針類型是多級「鑽石」層次結構中的一個類的對象,但該對象本身是另一個派生類 - 但與此指針類型對應的類* IS *是一個多態類型(即,它至少具有一個定義的虛函數,因此具有一個vtable)即Boost。序列化會正確地序列化對象,包括一直到其最派生類成員(即使指針指向基類類型)? –

+0

@DanNissenbaum如果你有一個多態的層次結構,你需要[導出或註冊](http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/serialization.html#derivedpointers)通過指向較少派生類型的指針進行序列化。此外,您必須反序列化爲您序列化的同一類型(不同類型未在boost :: serialization單元測試中進行測試)。 –

+0

@AnonymousCoward'BOOST_SERIALIZATION_BASE_OBJECT_NVP'優先於'boost :: serialization :: base_object (* this);'? –