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 :

Boost Serialization / pointeurs / polymorphisme


Sujet :

Boost C++

  1. #1
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut Boost Serialization / pointeurs / polymorphisme
    Bonjour,

    J'ai bien lu la doc de boost.

    J'ai bien lu aussi le tuto de Pierre Schwartz.

    J'ai bien lu aussi diverses discussions du forum

    Et je n'arrive toujours pas à sérialiser en cascade des pointeurs d'objets polymorphiques.

    Mes classes à sérialiser sont assez simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class NetworkMessage{
            virtual void serialize(boost::archive::binary_oarchive& ar, const unsigned int version) = 0;
            virtual void serialize(boost::archive::binary_iarchive& ar, const unsigned int version) = 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class NetworkMessagePing : public NetworkMessage
    {
    private:
        int m_iPingId;
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class NetworkMessageSynchroTurn : public NetworkMessagePing
    {
    private:
        int m_iTurnId;
    ...
    }
    Et j'implémente tout bien comme on m'a dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void NetworkMessageSynchroTurn::serialize(boost::archive::binary_oarchive& ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<NetworkMessagePing>(*this);       
        ar & m_iTurnId;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void NetworkMessagePing::serialize(boost::archive::binary_oarchive& ar, const unsigned int version)
    {
        boost::serialization::base_object<NetworkMessage>(*this);
        ar & m_iPingId;
    }
    Le résultat, c'est qu'au moment de la déserialisation d'un pointeur de NetworkMessageSynchroTurn, la variable m_iTurnId est bien restituée, mais pas la variable m_iPingId.

    Je n'ai pas de problème de cast cependant (le type restitué est le bon).
    Si, maintenant, j'écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void NetworkMessageSynchroTurn::serialize(boost::archive::binary_oarchive& ar, const unsigned int version)
    {
        boost::serialization::base_object<NetworkMessagePing>(*this);
        ar & NetworkMessagePing::serialize(ar,version);
        ar & m_iTurnId;
    }
    Alors tout fonctionne parfaitement, mais c'est explicitement déconseillé par boost (selon Pierre Schwartz)

    Note1 : quelque part ailleurs, dans mon programme, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        archive.template register_type<AGE::NetworkMessagePing>();
        archive.template register_type<AGE::NetworkMessageSynchroTurn>();
    Note 2 : j'ai aussi essayé en déclarant NetworkMessage non-abstraite, avec une méthode NetworkMessage::serialize vide, et j'ai exactement le même comportement.

    J'en suis venu à douter de la "bonne façon de faire", est-ce que quelqu'un peut confirmer qu'appeler le serialize de la classe mère depuis le serialize de la classe fille est effectivement déconseillé, car boost::serialization::base_object devrait le faire ?

    Merci

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bonjour,

    Je trimballe ce problème depuis 9 mois maintenant, au point qu'il va finir par être génant. Je n'ai pas trouvé d'explication de mon coté, ni d'affirmation ou d'infirmation de cette bonne pratique.

    Je suppose que si personne n'a répondu, c'est que personne n'a d'élément de réponse. Je me permet de remettre le sujet en haut de la pile quand même.

    Merci à ceux qui ont lu.

  3. #3
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bon et bien cette longue pause m'aura été utile.

    Il y avait deux erreurs :
    1. j'ai oublié le "ar &" devant l'appel à base_class
    2. il ne faut surtout pas déclarer les méthodes serialize comme virtuelles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class NetworkMessage{
            virtual <= non void serialize(boost::archive::binary_oarchive& ar, const unsigned int version) = 0;
            virtual <= non void serialize(boost::archive::binary_iarchive& ar, const unsigned int version) = 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void NetworkMessagePing::serialize(boost::archive::binary_oarchive& ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<NetworkMessage>(*this);
        ar & m_iPingId;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/06/2011, 13h38
  2. Réponses: 2
    Dernier message: 10/03/2011, 00h44
  3. boost::serialization et pointeur
    Par guillaume07 dans le forum Boost
    Réponses: 2
    Dernier message: 12/07/2010, 10h15
  4. Boost Serialization pointeur
    Par pavel dans le forum Boost
    Réponses: 8
    Dernier message: 09/02/2010, 18h25
  5. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03

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