IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Difficultés avec la sérialisation.


Sujet :

Boost C++

  1. #1
    Invité
    Invité(e)
    Par défaut 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 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.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon on dirait que c'est lorsque il y a une classe intermédiaire dans l'héritage entre la classe de base et la sous sous classe, boost n'enregistre pas toutes les classes dérivée.

    Je ne vois qu'une solution pas très cool : sauvegarder tout les attributs des super classes manuellement. :/

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Est-ce que tu as lu : http://www.boost.org/doc/libs/1_55_0...l#registration

    En particulier, je pense que ton problème serait résolu si tu ajoutes quand tu crées ton archive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ar.template register_type<Entity>();
    ar.template register_type<Model>();
    ar.template register_type<Wall>();
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui mais si mes classes Model et Entity son abstraite alors comment faire pour les enregistrer ?
    Parce que ça me donne une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cannot allocate an object of type Entity because the following function are abstract : ...
    Bref j'ai pas très bien compris la doc et il y a plusieurs manière différente de "register" les types des objets dans les archives (via des macros ou bien des fonctions) mais j'ai plus trop cherché à comprendre, j'ai plutôt essayé de faire mon propre système de sérialisation qui semble lui, bien fonctionné.

Discussions similaires

  1. [SSIS][2k5]Difficulté avec SSIS
    Par david71 dans le forum SSIS
    Réponses: 9
    Dernier message: 05/01/2006, 19h28
  2. [JS] Difficulté avec le onmouseover...
    Par Pleymo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/11/2005, 12h09
  3. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  4. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo