Difficultés avec la sérialisation.
Salut,
J'essaye de sérialiser des objets mais je rencontre quelque difficulté lorsque j'essaye d'enregistrer des objets pointant vers une classe de base.
Par exemple j'ai une classe Transformable dont dérive une classe entité que voici :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
template <typename Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<Transformable>(*this);
boost::serialization::void_cast_register<Entity, Transformable>(
static_cast<Entity *>(NULL),
static_cast<Transformable *>(NULL)
);
ar & id;
ar & type;
ar & collisionVolume;
ar & faces;
ar & parent;
ar & children;
} |
La classe tile dérive de la classe entité.
Code:
1 2 3 4 5 6 7 8
|
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<Entity>(*this);
boost::serialization::void_cast_register<Tile, Entity>(
static_cast<Tile *>(NULL),
static_cast<Entity *>(NULL)
);
} |
Ok jusque là pas de problème ça m'enregistre bien la tile si j'écris ceci avant le main :
BOOST_CLASS_EXPORT_GUID(odfaeg::g2d::Tile, "Tile")
Ensuite j'ai une autre classe : la classe Wall qui hérite de la classe Model et la classe Model hérite elle même de la classe entité, bref voici de que donne les méthodes :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
template <typename Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<Entity>(*this);
boost::serialization::void_cast_register<Model, Entity>(
static_cast<Model*>(NULL),
static_cast<Entity*>(NULL)
);
ar & segments;
ar & points;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
void serialize(Archive &ar, const unsigned int version) {
ar & boost::serialization::base_object<Model>(*this);
boost::serialization::void_cast_register<Wall, Model>(
static_cast<Wall *>(NULL),
static_cast<Model *>(NULL)
);
ar & tile;
/*ar & shadow;
ar & shadowCenter;*/
ar & type;
ar & height;
} |
Et voici le main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
BOOST_CLASS_EXPORT_GUID(odfaeg::g2d::Tile, "Tile")
BOOST_CLASS_EXPORT_GUID(odfaeg::g2d::Wall, "Wall")
int main(int argc, char* args[])
{
sf::VideoMode mode(800, 600);
sf::ContextSettings settings(0, 0, 4, 3, 0);
odfaeg::RenderWindow window(mode, "test", sf::Style::Default, settings);
odfaeg::Texture tex;
tex.loadFromFile("tilesets/murs.png");
odfaeg::g2d::Entity* tile = new odfaeg::g2d::Tile (&tex, odfaeg::Vec3f(0, 0, 0), odfaeg::Vec3f(100, 100, 0), sf::IntRect(0, 0, 100, 100));
odfaeg::g2d::Entity* wall = new odfaeg::g2d::Wall (0, 80, static_cast<odfaeg::g2d::Tile*>(tile), odfaeg::g2d::AmbientLight::getAmbientLight());
std::ofstream ofs("FichierDeSerialisation.tex");
{
boost::archive::text_oarchive oa(ofs);
oa<<wall;
}
ofs.close();
std::ifstream ifs("FichierDeSerialisation.tex");
{
boost::archive::text_iarchive ia(ifs);
ia>>wall;
}
ifs.close();
while (window.isOpen()) {
sf::Event event;
while(window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
window.draw(*tile);
window.display();
window.clear();
}
delete wall;
delete tile;
return 0;
} |
Voila le problème c'est que j'ai cette erreur suivante dès que je veux créer un objet de type Wall :
boost::archive::archive_exception what(): unregistered class - derived not registered or exported.
Pourquoi il me dit que je n'ai pas enregistrer la classe hors que je l'ai enregistrée ?
Merci d'avance pour l'aide.