2014-07-23 21 views
1

我使用升壓序列化\反序列化幾個班到磁盤。我正在重構許多需要更改類層次結構的類。我希望下面的僞代碼是足夠清晰的傳達我的情況:使用Boost,如何反序列化的C++類之後的類層次結構發生變化

原來的設計是類似以下內容:

class Alpha : public BaseOne, public BaseTwo 
{ 
    //member data omitted 
    void serialize(Archive & ar, const unsigned int version); 
} 
inline void Alpha::serialize(Archive & ar, const unsigned int version) 
{ 
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseOne); 
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseTwo); 
    // also serialize member data 
} 

class Beta: public Alpha 
{ 
    //member data omitted 
    void serialize(Archive & ar, const unsigned int version); 
} 

inline void Beta:::serialize(Archive & ar, const unsigned int version) 
{ 
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Alpha); 
    // also serialize member data 
} 

類層次結構已更改爲以下幾點:

class Alpha : public BaseOne 
{ 
    void serialize(Archive & ar, const unsigned int version); 
} 

class Beta: public Alpha, public BaseTwo 
{ 
    void serialize(Archive & ar, const unsigned int version); 
} 

是否可以將以前的類層次結構保存的數據反序列化爲新設計?

問候, 約翰

回答

1

我會假設你熟悉升壓序列化的常規版本支持(Boost class serialization, change in member types))。

在這種情況下,我會說,你不能指望這個工作,因爲該類型信息是「在路上」在數據流中(並有可能不再被映射)。我建議讓舊的等級仍然可用,例如使用內聯的命名空間:

namespace MyNS 
{ 
     namespace V1 { 

      struct Alpha; 
      struct Beta; 

     } 

     inline namespace V2 { 

      struct Alpha; 
      struct Beta; 

      struct Document { /* */ } 

      Document upgrade(V1::Document&&); 
     } 

} 
相關問題