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:
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:
1 2 3 4 5 6 7
|
class NetworkMessagePing : public NetworkMessage
{
private:
int m_iPingId;
...
} |
Code:
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:
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:
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:
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:
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