Estoy intentando serializar mis estructuras de datos para escribirlas en un socket tcp.Error al serializar una clase abstracta con refuerzo
Hasta ahora encontré que mi problema es la serialización. Incluso traté de usar
BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)
pero no encuentro ningún ejemplo de trabajo similar a mi programa y cómo implementarlo correctamente.
Éstos son algunos de los enlaces que he visitado:
- 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
Mis estructuras de datos son un poco más complicado que éste, pero vamos a suponer que tengo la siguiente estructura
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);
}
};
Se definen los métodos virtuales en aquí.
MoveNormal.cpp
#include "MoveNormal.h"
bool MoveNormal::isJump(void) {
return false;
}
Mi main.cpp se ve así:
#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;
}
Pero cuando ejecuto el programa me sale el siguiente error:
Unhandled exception at 0x76dbb9bc in Test.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x001df078..
I' m utilizando VS2010 y Boost 1.48.0.
declaro un operador sobrecargado << como un amigo de la clase, luego impleméntelo, Considerando que su estructura de datos consiste en solo un valor int, esto debería ser completamente trivial que hacer. Si necesita transmitir esto sobre un socket, simplemente reinterprete_cast el int a char * y envíelo a través del socket;) – johnathon
El hecho es que mi estructura de datos no tiene solo un int. El ejemplo anterior es una estructura simple creada solo para este caso. Considere que dentro de mi estructura tengo punteros a otras clases y contenedores stl. Hasta ahora, creo que he descubierto cómo hacerlo funcionar. Solo lo estoy probando en mi proyecto y publicaré la solución aquí tan pronto como pueda. – ealves