Sto provando a serializzare le mie strutture di dati per scriverle su un socket tcp.Errore di serializzazione di una classe astratta con boost
Finora ho scoperto che il mio problema è la serializzazione. Ho anche provato a usare
BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)
ma non riesco a trovare alcun esempio di lavoro simile al mio programma e come implementarlo correttamente.
Ecco alcuni dei link che ho visitato:
- http://programmers-blog.com/category/c-c
- http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/tutorial.html#simplecase
- http://en.highscore.de/cpp/boost/serialization.html#serialization_class_hierarchies
mie strutture di dati sono un po 'più complicato, allora questo, ma supponiamo che ho la seguente struttura
Coordinate.h
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
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<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & this->c;
}
};
Move.h
class Coordinate;
#include "Coordinate.h"
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
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<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & this->destination;
}
};
MoveNormal.h
class Coordinate;
#include "Move.h"
#include "Coordinate.h"
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
class MoveNormal : public Move {
public:
MoveNormal() {}
MoveNormal(Coordinate *destination) { this->destination = destination; }
~MoveNormal() {}
virtual bool isJump(void);
private:
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & boost::serialization::base_object<Move>(*this);
}
};
I metodi virtuali sono definiti qui.
MoveNormal.cpp
#include "MoveNormal.h"
bool MoveNormal::isJump(void) {
return false;
}
mio main.cpp si presenta così:
#include "Coordinate.h"
#include "Move.h"
#include "MoveNormal.h"
#include <fstream>
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
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;
}
Ma quando ho eseguito il programma ottengo il seguente errore:
Unhandled exception at 0x76dbb9bc in Test.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x001df078..
I' m utilizzando VS2010 e Boost 1.48.0.
dichiarare un operatore sovraccarico << come un amico della classe, quindi implementarlo, Considerando che la struttura dati è costituita da un valore int questo dovrebbe essere completamente banale fare. Se hai bisogno di trasmetterlo su un socket, semplicemente reinterpret_cast l'int a char * e invialo sul socket;) – johnathon
Il fatto è che la mia struttura dati non ha solo un int. L'esempio sopra è una struttura semplice creata solo per questo caso. Considera che all'interno della mia struttura ho dei riferimenti ad altre classi e ai contenitori di stl. Finora penso di aver capito come farlo funzionare. Lo sto solo testando nel mio progetto e posterò la soluzione qui il prima possibile. – ealves