2014-09-10 19 views
0

我使用升壓序列化(V 1.55,我想實現序列化行爲foo是依賴於存檔類型(XML或二進制)在同一。時間,我需要使用多態存檔類型下面是一個簡單的例子:升壓系列化 - 多態存檔 - 存檔類型有關的行爲

#include <sstream> 

#include <boost/archive/polymorphic_binary_iarchive.hpp> 
#include <boost/archive/polymorphic_binary_oarchive.hpp> 
#include <boost/archive/polymorphic_xml_iarchive.hpp> 
#include <boost/archive/polymorphic_xml_oarchive.hpp> 

#include <boost/archive/binary_iarchive.hpp> 
#include <boost/archive/binary_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 

using namespace boost::archive; 

typedef polymorphic_binary_iarchive BI; 
typedef polymorphic_binary_oarchive BO; 
typedef polymorphic_xml_iarchive XI; 
typedef polymorphic_xml_oarchive XO; 
/* 
typedef binary_iarchive BI; 
typedef binary_oarchive BO; 
typedef xml_iarchive XI; 
typedef xml_oarchive XO; 
*/ 
struct foo 
{ 
     void save(BO & ar, unsigned int const & version) const {} 
     void load(BI & ar, unsigned int const & version) {} 
     void save(XO & ar, unsigned int const & version) const {} 
     void load(XI & ar, unsigned int const & version) {} 
     BOOST_SERIALIZATION_SPLIT_MEMBER(); 
}; 

int main() 
{ 
     std::stringstream ss; 
     XO ar(ss); 
     foo f; 
     ar << BOOST_SERIALIZATION_NVP(f); 
} 

代碼編譯,如果我使用非多態性存檔類型,但與多態的類型,我收到以下錯誤

error: no matching function for call to ‘foo::save(boost::archive::polymorphic_oarchive&, const unsigned int&) const 

如此看來,存檔在ar <<呼叫中鍵入更改。有誰知道如何實現這一點?

回答

1

多態存檔的整點是,你可以不知道前面是會使用什麼樣的存檔實現。事實上,它可能是不存在的存檔類型,在一個動態加載,的3rdParty庫中實現:

多態存檔的主要工具將允許類DLLs,其中包含的層樓高所有當前和未來檔案的序列化代碼,無冗餘代碼。docs

只要你開始做具體的存檔類型進行特殊處理,你起碼游泳上游,並可能自找麻煩。

我建議你重新考慮認爲需要檢測在運行時的存檔實現。即使有辦法讓在RTTI在運行時執行類型的typeid

  • 你會如何處理未知類型?
  • 你將如何處理從xml_archive繼承的類型? (真的沒有辦法在運行時檢測這一點)
  • 你會如何處理該聚集這樣的xml_archive類型? (甚至在編譯時甚至沒有辦法檢測到這種情況,更不用說在運行時檢測了),

總之,如果你有特殊處理,編碼它。只需實現saveXml函數或saveAs(SaveOptions format)。您可以使用多態歸檔來實現這兩者之一,並通過引用獲取xml_oarchive&(這樣您就可以接受派生實現了)。

$ 0.02