私は読んで、相互参照し、最終的に一貫した例と答えを見つけられませんでした。私がやろうとしていることはかなり単純ですが、私は明らかに何かが欠けています。私は、このベクターを含む別のオブジェクトをシリアル化したいブーストシリアライゼーション例外:登録されていないクラス、多型ベースの問題のシリアル化
std::vector<AA*>
:英語で、私は、私のように管理する2つの抽象塩基(ピュアBBは、純粋なAAから派生)、とクラス構造を持っています。以外のすべては、このベクトルは罰金シリアライズし、それはベクトルになったら、それはスロー:
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): unregistered class - derived class not registered or exported
iは明示ベースの抽象を宣言、明示的にシリアライズする前に、親タイプを登録するなど、いくつかのことを、試してみましたクラス '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();
}