일관성있는 예제와 응답을 읽고 상호 참조하고 궁극적으로 찾지 못했습니다. 내가하려고하는 일은 꽤 간단하지만, 나는 분명히 뭔가를 놓치고있다. 내가이 벡터를 포함하는 다른 객체를 직렬화하고 싶습니다부울 직렬화 예외 : 등록되지 않은 클래스, 다형성 기본 문제 직렬화
std::vector<AA*>
: 영어로, 나는이 같은 관리 두 추상베이스 (순수 BB 순수 AA에서 파생)와 클래스 구조를 가지고있다. 제외한 모든 이 벡터 잘 직렬화하지만,이 벡터에 도달하면, 그것은 예외 :
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): unregistered class - derived class not registered or exported
내가 명시 적 기본 추상적 인 선언, 명시 적으로 직렬화하기 전에 부모 유형을 등록 포함한 몇 가지를 시도했습니다 클래스 'BOOST_SERIALIZATION_ASSUME_ABSTRACT'등과 같은 그러나, 나는 런타임에 예외와 함께 떠났어.
저는이 예제 (및 솔루션)를 레코드에 제공하여 다른 사람들이이 불량한 것을 약간 불투명 한 라이브러리로 사용할 수 있도록하고 싶습니다. 일단이 예제가 정사각형이라면 FAQ 나 문서에 적합하도록 부스트 직렬화 관리자에게 제출할 것입니다.
/*
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();
}