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();
}