我一直在阅读,交叉引用,最终没有找到一个连贯的例子和答案.我想做的事情很简单,但我显然错过了一些东西.在英语中,我有一个带有两个抽象基础的类结构(纯BB来自纯AA),我管理的是:
std::vector<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’等明确声明基本抽象类,但是,我在运行时留下了异常.
我想在记录中得到这个例子(和解决方案),以便其他人可以使用这个优秀的,如果有点不透明的库.一旦这个例子是正方形,我会将它提交给boost序列化维护者,以便在他们认为合适的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();
}
解决方法:
我对此进行了一些小修改:
>替换ar& bser :: base_object< AA>(* this);在BB ::序列化:
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(AA);
>替换ar& bser :: base_object< BB>(* this);在CC :: serialize中:
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BB);
>在CC定义后添加BOOST_CLASS_EXPORT(CC).有关说明,请参见this documentation section.