2014-09-10 46 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