Я пытаюсь сериализовать свои структуры данных, чтобы записать их в 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.