Ошибка сериализации абстрактного класса с помощью boost

Я пытаюсь сериализовать свои структуры данных, чтобы записать их в tcp-сокет.

Пока что я обнаружил, что моя проблема заключается в сериализации. Я даже пытался использовать

BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)

но не могу найти ни одного рабочего примера, похожего на мою программу и как правильно ее реализовать.

Вот некоторые из ссылок, которые я посетил:

Мои структуры данных немного сложнее, чем эта, но давайте предположим, что у меня есть следующая структура

Coordinate.h

#include 
#include 

class Coordinate {
public:
    Coordinate() {}
    Coordinate(int c) : c(c) {}
    int get(void) { return c; }
    std::string toString(void);
private:
    int c;
    friend class boost::serialization::access;
    template
    void serialize(Archive &ar, const unsigned int version) {
        ar & this->c;
    }
};

Move.h

class Coordinate;

#include "Coordinate.h"

#include 
#include 

class Move {
public:
    Move() {}
    ~Move() {}
    Coordinate* getCoordinate(void) {return this->destination; }
    virtual bool isJump(void) = 0;
protected:
    Coordinate *destination;
private:
    friend class boost::serialization::access;
    template
    void serialize(Archive &ar, const unsigned int version) {
        ar & this->destination;
    }
};

MoveNormal.h

class Coordinate;

#include "Move.h"
#include "Coordinate.h"

#include 
#include 

class MoveNormal : public Move {
public:
    MoveNormal() {}
    MoveNormal(Coordinate *destination) { this->destination = destination; }
    ~MoveNormal() {}
    virtual bool isJump(void);
private:
    friend class boost::serialization::access;
    template
    void serialize(Archive &ar, const unsigned int version) {
        ar & boost::serialization::base_object(*this);
    }
};

Виртуальные методы определены здесь.

MoveNormal.cpp

#include "MoveNormal.h"

bool MoveNormal::isJump(void) {
    return false;
}

Мой main.cpp выглядит так:

#include "Coordinate.h"
#include "Move.h"
#include "MoveNormal.h"

#include 

#include 
#include 

int main(int argc, char *argv[]) {
    Coordinate *c = new Coordinate(10);
    // This runs OK
    /*
    {
        std::ofstream ofs("f.txt");
        boost::archive::text_oarchive oa(ofs);
        oa << c;
    }
    Coordinate *d;
    {
        std::ifstream ifs("f.txt");
        boost::archive::text_iarchive ia(ifs);
        ia >> d;
    }
    std::cout << "c.get(): " << c->get() << std::endl;
    std::cout << "d.get(): " << d->get() << std::endl;
    */

    // This is where I get my error
    Move *m  = new MoveNormal(c);
    {
        std::ofstream ofs("f.txt");
        boost::archive::text_oarchive oa(ofs);
        oa << m;    // Line where the error occurs
    }
    return 0;
}

Но когда я запускаю программу, я получаю следующую ошибку:

Необработанное исключение по адресу 0x76dbb9bc в Test.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x001df078...

Я использую VS2010, и Boost 1.48.0.

5
задан Cœur 13 December 2017 в 07:37
поделиться