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; ... }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
7 class NetworkMessageSynchroTurn : public NetworkMessagePing { private: int m_iTurnId; ... }
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; }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.
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; }
Je n'ai pas de problème de cast cependant (le type restitué est le bon).
Si, maintenant, j'écris ceci :
Alors tout fonctionne parfaitement, mais c'est explicitement déconseillé par boost (selon Pierre Schwartz)
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; }
Note1 : quelque part ailleurs, dans mon programme, j'ai ceci :
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.
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>();
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
Partager