2011-05-19 175 views
5

我有以下問題。Boost序列化/反序列化存檔「流錯誤」異常

我有一個名爲A.h的文件和一個文件B.h.每個包含一些結構是這樣的:(兩班裏面的結構是不同的)

struct Base 
{ 
    friend class access; 

    template <typename Archive> 
    void serialize(Archive& ar,const unsigned int version) 
    { 
     ar & fieldLength; 
     ar & fieldMD; 
     ar & fieldTime_Stamp; 
    } 
    public: 
     unsigned int fieldLength; 
     unsigned int fieldMD; 
     unsigned int fieldTime_Stamp; 

     virtual void f(){} //to be polymorphic the struct 
}; 

struct Derived:public Base 
{ 
    ... 
} 

所以我序列中的經典方式的結構:

.... 

std::ostringstream archive_stream; 

boost::archive::text_oarchive archive(archive_stream); 

archive.register_type(static_cast<Derived*>(NULL)) 

archive <<p; // where p is a pointer to Base 

現在的問題... 上反序列化方面,我遵循相同的(逆向)程序......如果我單獨反序列化Ah中的結構(不包括在項目Bh中)和Bh中的結構(不包括在項目中)所有的作品......但如果我在項目中都包含這兩個類,則反序列化對一個類有效,但會在「arc」指令中拋出「Stream error exception」蜂房>> m;「對於其他...這似乎是在註冊類或類似的東西這樣的衝突... 任何想法?謝謝...

+0

顯示您的實際反序列化代碼。 – ildjarn 2011-05-19 07:03:08

+0

std :: istringstream archive_stream(mex); // mex是從套接字接收的序列化數據 \t boost :: archive :: text_iarchive archive(archive_stream); archive.register_type(static_cast (NULL)); ... \t Base * m; 檔案>> m; – marco 2011-05-19 07:07:35

+0

我觀察到我通過archive.register_type()註冊了類,儘管我在單獨的進程中創建了兩個(本地)text_iarchive(我使用fork調用)......實際上,如果我評論第二個過程的註冊碼,所有作品...怎麼可能? – marco 2011-05-19 09:43:05

回答

2

您是否已序列化派生類serialize函數中的基礎數據?

ar & boost::serialization::make_nvp("base", boost::serialization::base_object<Base>(*this)); 

,我不知道這是否會幫助,但我用

BOOST_CLASS_IMPLEMENTATION(x, boost::serialization::object_serializable); 
BOOST_CLASS_TRACKING(x, boost::serialization::track_never) 

爲serialiseable註冊類。希望有幫助:3