для объяснения.

ал, перекрестные ссылки, и в конечном итоге не нашел последовательного примера и ответа. То, что я пытаюсь сделать, довольно просто, но я явно что-то упускаю. в английском у меня есть структура класса с двумя абстрактными основаниями (чистый 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' и т. д., однако, во время выполнения я остался за исключением.

Я хотел бы получить этот пример (и решение) для записи, чтобы другие могли использовать эту превосходную, хотя и немного непрозрачную, библиотеку. как только этот пример будет квадратным, я передам его специалистам по поддержке сериализации для включения в 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();
}

Ответы на вопрос(1)

Ваш ответ на вопрос