gpt4 book ai didi

c++ - boost序列化异常: unregistered class,序列化多态基础问题

转载 作者:可可西里 更新时间:2023-11-01 16:39:42 26 4
gpt4 key购买 nike

我一直在阅读、交叉引用,但最终没有找到连贯的示例和答案。我想做的很简单,但我显然遗漏了一些东西。在英语中,我有一个具有两个抽象基础的类结构(纯 BB 派生自纯 AA),我将其管理为:

std::vector<AA*>

我想序列化另一个包含这个 vector 的对象。所有除了这个 vector 都可以很好地序列化,但是一旦它到达 vector ,它就会抛出:

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 序列化维护者,以便在他们认为合适的时候包含在常见问题解答或文档中。

复制以下问题的示例代码:

/*
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::serialize与:

    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(AA);
  • 替换ar & bser::base_object< BB >( *this );CC::serialize与:

    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BB);
  • 添加 BOOST_CLASS_EXPORT(CC)CC 之后定义。参见 this documentation section寻求解释。

关于c++ - boost序列化异常: unregistered class,序列化多态基础问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4432019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com