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