2011-05-19 6 views
5

Ben ettik aşağıdaki sorun .. Boost seri/seri kaldırma arşivi "stream hatası" istisna

Ben A.h adlı bir dosya ve bir dosya B.H. var (Iki sınıf içindeki yapılar farklıdır)

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 
{ 
    ... 
} 

Yani klasik tarzda yapı serialize: ŞİMDİ

.... 

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 

PROBLEM ... her bu gibi bazı yapı içeriyor serileştirme tarafı, aynı (ters) prosedürü izlerim ... eğer Ah içindeki yapıları (Bh projesine dahil olmadan) ve Bh'deki yapıları (Ah projesine dahil etmeden) tekil olarak düzenlerse tüm işler .... Projeye hem sınıfları dahil ettiysem, bir sınıf için serileştirme işlemi çalışır, ancak talimatta "Akış hatası istisnasını" atar. kovan >> m; " diğeri için ... kayıt sınıfında bir çakışma gibi görünüyor ya da bu gibi bir şey ... Herhangi bir fikiriniz var mı? Teşekkürler ...

+0

Gerçek serileştirme kodunuzu gösterin. – ildjarn

+0

std :: istringstream archive_stream (mex); // mex, soket \t boost :: archive :: text_iarchive arşivi (archive_stream) biçiminde alınan seri hale getirilmiş verilerdir; archive.register_type (static_cast (NULL)); ... \t Temel * m; arşivi >> m; – marco

+0

Ayrı işlemlerde iki (yerel) text_iarchive (çatal çağrıyı kullanırım) oluşturmama rağmen, sınıfın archive.register_type() yoluyla kaydedilmesiyle ilgili bir çakışma olduğumu gözlemledim. İkinci sürecin kayıt kodu, tüm işler ... nasıl mümkün olabilir? – marco

cevap

2

Türetilmiş sınıf serileştirme işlevinde temel verileri serileştirdin mi?

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

Ve bu yardım edersen bilmiyorum ama serialiseable olarak sınıflar kayıt

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

kullanın. Umarım yardımcı olur: 3