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 cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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 cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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 cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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 cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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 cpp : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager