2012-04-30 27 views
2

多態類的boost序列化似乎不起作用(1.40+ boost),例如,使用下面的代碼,我相信我遵循了以下規則:導出類和 我在gcc4.4(ubuntu)和windows VS2010(使用boost 1.48)上嘗試過: 在以下程序中,我期望同時打印10和100 ,但它只打印10個,這意味着它只能序列化基類;boost序列化多態性問題

我大部分都是從boost文檔中複製出來的,但它仍然不起作用;任何人有任何想法? 非常感謝 LS

#include <iostream> 
#include <sstream> 
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/serialization.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#define NVP(X) X 

class base { 
public: 
friend class boost::serialization::access; 
base(){ v1 = 10;} 
int v1; 
template<class Archive> 
void serialize(Archive & ar, const unsigned int file_version) 
{ 
    ar & NVP(v1); 
} 
}; 


class derived : public base { 
public: 
friend class boost::serialization::access; 
int v2 ; 
derived() { v2 = 100;} 
template<class Archive> 
void serialize(Archive & ar, const unsigned int file_version){ 
    boost::serialization::base_object<base>(* this); 
    ar & NVP(v2); 
} 
}; 
BOOST_CLASS_EXPORT(base); 
BOOST_CLASS_EXPORT_GUID(derived, "derived"); 


int main () 
{ 
std::stringstream ss; 
boost::archive::text_oarchive ar(ss); 
base *b = new derived(); 
ar << NVP(b); 
std::cout << ss.str(); 
} 

回答

5

你忘

virtual ~base() {} 

這對於多態seriialization工作不僅是必需的(沒有它你的類是多態),但我相信忽略它是48個州的輕罪。 IANAL,YMMV。

哦,應該是ar & boost::serialization::base_object<...>

+0

我甚至不知道這是否是這個問題的正確答案,但爲了搞笑+1 – Rado