2010-11-18 74 views
0

我有一個基類和4個派生類。我將所有派生類存儲在基類指針類型的向量中。在第一次初始化期間,我使用構造函數以不同的方式創建每個派生類型基本上他們每個人都有不同的參數類型。 (我不得不提供一個受保護的默認ctor來編譯BOOST_CLASS_EXPORT,但這是一個不同的故事)。我沒有/不能保存這些派生類的所有成員(填入ctor)。boost :: serialization多態類型初始化

現在,當我使用boost :: serialize從磁盤加載對象時,這些成員(沒有序列化並且針對每個派生類型)被銷燬。而且,我不能想辦法重新初始化這些派生類型,因爲我只存儲基類指針。

正是我需要的是能夠載入我的派生類型(指針)部分,但不刪除其所有內容..

有沒有辦法來解決這個問題,一個神奇的升壓定義或函數調用吧?否則,使用boost :: serialize的多態性是不可能的。我應該錯過一些東西,希望我能夠很好地定義我的問題。

回答

0

您不應該爲了序列化而創建默認構造函數。您可以改爲保存/加載非默認構造函數所需的數據,並在加載時使用它構造新的對象。

這樣,無論您的構造函數如何確保數據成員的有效性也可以在序列化期間發生,並且序列化庫永遠不必直接操縱對象的數據成員。這應該防止數據擦除。

例如,如果你的類可以使用namesize構造,可以按如下方式重載函數:

template <class Archive> 
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) { 
    ar << my_class->name(); 
    ar << my_class->size(); 
} 

template<class Archive> 
inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) { 
    std::string name; 
    int size; 
    ar >> name; 
    ar >> size; 
    ::new(t)my_class(name, size); // placement 'new' using your regular constructor 
} 

退房的文檔here