Bonjour,
j'essaye d'utiliser boost pour la sérialisation d'objets.
Par contre ça ne semble pas fonctionner très bien pour les vecteurs de pointeurs, voici un code ou je veux sauvegarder un vecteur de pointeurs :
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
42
43
44
45
46 #ifndef T_GROUND #define T_GROUND #include "../../../../include/odfaeg/Graphics/2D/tile.h" namespace odfaeg { namespace g2d { class BigTile : public Entity, public Selectable { friend class boost::serialization::access; public : BigTile() : Entity (Vec3f(0, 0, 0), Vec3f (0, 0, 0), Vec3f (0, 0, 0), "E_BIGTILE") {} BigTile (Vec3f pos); bool operator== (Entity &entity); void addTile (Tile *tile); void removeTile (Tile *tile); std::vector<Tile*> getTiles (); template <typename Archive> void serialize(Archive &ar, const unsigned int version) { ar & boost::serialization::base_object<Entity>(*this); ar & tiles; } bool isAnimated() const { return false; } bool isModel() const { return false; } bool selectable() const { return true; } bool isLight() const { return false; } bool isShadow() const { return false; } bool isLeaf() const { return false; } private : void recomputeSize(); std::vector<Tile*> tiles; }; } } #endif // T_GROUND
Ca se sérialise bien pour la classe tile toute seule :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void serialize(Archive & ar, const unsigned int version) { ar & boost::serialization::base_object<Entity>(*this); }
mais une fois que j'ai des objets qui contiennent des vecteurs de pointeurs vers des autres entités, là, ça ne marche plus, En fait ici, j'ai bien la taille du vecteur de tiles qui vaut un lorsque je rajoute une tile à ma grande tile.
Le problème c'est que lors de la désérialisation, boost appelle le constructeur par défaut, du coup, la tile de ma grande tile ne conserve pas sa position, sa taille, etc...
A la compilation j'ai même du déclarer ce constructeur sinon ça ne marchait pas :
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 Tile::Tile() : Entity (Vec3f(0, 0, 0), Vec3f(1, 1, 1),Vec3f(0.5f, 0.5f, 0.5f),"E_TILE"){ Face* face = new Face(sf::TrianglesFan, getTransform()); Vec3f size(1, 1, 0); Vec3f position(0, 0, 0); Vec3f origin (0.5f, 0.5f, 0); Vertex v1(sf::Vector3f(position.x, position.y, position.z)); Vertex v2(sf::Vector3f(position.x + size.x, position.y, position.z)); Vertex v3(sf::Vector3f(position.x + size.x, position.y + size.y, position.z)); Vertex v4(sf::Vector3f(position.x, position.y + size.y,position.z)); face->append(v1, 0); face->append(v2, 1); face->append(v3, 2); face->append(v4, 3); addFace(face); }
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 #include "odfaeg/Graphics/2D/tGround.h" #include "odfaeg/Core/boost/serialization/export.hpp" #include "boost/archive/text_oarchive.hpp" #include "boost/archive/text_iarchive.hpp" BOOST_CLASS_EXPORT_GUID(odfaeg::g2d::Tile, "Tile") BOOST_CLASS_EXPORT_GUID(odfaeg::g2d::BigTile, "BigTile") int main(int argc, char* args[]) { odfaeg::g2d::Tile tile(nullptr, odfaeg::Vec3f(0, 0, 0), odfaeg::Vec3f(120, 60, 0),sf::IntRect(0, 0, 100, 50)); odfaeg::g2d::BigTile bt(odfaeg::Vec3f(0, 0, 0)); bt.addTile(&tile); std::ostringstream oss; { boost::archive::text_oarchive oa(oss); oa<<bt; } std::istringstream iss(oss.str()); { boost::archive::text_iarchive ia(iss); ia>>bt; } odfaeg::g2d::Tile* t = bt.getTiles()[0]; std::cout<<"tile : "<<t->getPosition()<<t->getSize(); MyAppli app(sf::VideoMode(800, 600, 32), "Test odfaeg"); return app.exec(); }
Donc pas de soucis pour sérialiser les objets sauf pour les vecteurs de pointeurs.
Partager