2010-12-13 13 views
9

Czytałem, odwołując się, a ostatecznie nie znajdując spójnego przykładu i odpowiedzi. to, co próbuję zrobić, jest całkiem proste, ale wyraźnie czegoś brakuje. w języku angielskim, Mam struktury klasowej z dwoma abstrakcyjnych zasad (pure BB czerpie z czystego AA), które udaje mi jak:Wyjątek serializacji doładowania: niezarejestrowana klasa, serializująca polimorficzny problem podstawowy

std::vector<AA*> 

chciałbym serializacji inny obiekt zawierający ten wektor. wszystko wyjątkiem ten wektor serializes w porządku, ale gdy dostaje się do wektora, rzuca:

terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): unregistered class - derived class not registered or exported 

Próbowałem kilka rzeczy, w tym wyraźnie rejestracji typy rodzicielskiej przed serializacji, wyraźnie deklarując streszczenie bazowej klasy jako takie z "BOOST_SERIALIZATION_ASSUME_ABSTRACT" itp. jednak pozostaję z wyjątkiem w czasie wykonywania.

Chciałbym uzyskać ten przykład (i rozwiązanie) na płycie, aby inni mogli używać tej doskonałej, choć nieco nieprzejrzystej biblioteki. gdy ten przykład będzie kwadratowy, przekażę go opiekunom serializacji doładowania w celu uwzględnienia w FAQ lub dokumentacji według własnego uznania.

przykładowy kod do replikowania poniższego problemu:

/* 
    g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest 
*/ 
#include <boost/serialization/serialization.hpp> 
#include <boost/serialization/nvp.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <boost/serialization/vector.hpp> 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

namespace bser = boost::serialization; 
class AA 
{ 
public: 
    virtual void foo() = 0; 
    std::string name; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar & bser::make_nvp("Name", name); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(AA); 

class BB : public AA 
{ 
public: 
    virtual void foo() = 0; 
    virtual void bar() = 0; 
    int thing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<AA>(); 
     ar & bser::base_object<AA>(*this); 
     ar & bser::make_nvp("Thing", thing); 
    } 
}; 
BOOST_SERIALIZATION_ASSUME_ABSTRACT(BB); 

class CC : public BB 
{ 
public: 
    virtual void foo() {} 
    virtual void bar() {} 
    int otherThing; 

    template<class Archive> 
    void serialize(Archive & ar, unsigned int file_version) 
    { 
     ar.template register_type<BB>(); 
     ar & bser::base_object<BB>(*this); 
     ar & bser::make_nvp("OtherThing", otherThing); 
    } 
}; 

int main (int argc, char const *argv[]) 
{ 
    const std::string filename("my.serialized"); 
    const std::string key("AAVector"); 

    std::vector< AA* > vv; 
    vv.push_back(new CC); 

    std::ofstream outfilestream(filename.c_str(), std::ios::binary); 
    boost::archive::xml_oarchive out_archive(outfilestream); 
    out_archive << boost::serialization::make_nvp(key.c_str(), vv); 
    outfilestream.close(); 
} 

Odpowiedz

6

mam to do pracy z niewielkimi modyfikacjami:

  • Wymień ar & bser::base_object<AA>(*this); w BB::serialize z:

    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(AA); 
    
  • Wymienić ar & bser::base_object<BB>(*this); w CC::serialize z:

    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BB); 
    
  • Dodaj BOOST_CLASS_EXPORT(CC) po CC definicji. Aby uzyskać wyjaśnienie, patrz: this documentation section.

Powiązane problemy