[boost::serialization] Serialization de classes "inconnues"

Serialization de classes "inconnues" [boost::serialization] - C++ - Programmation

Marsh Posté le 31-01-2010 à 13:34:17    

Bonjour,
 
Je m'adresse avant tout à des personnes qui maîtrisent bien boost::serialization ou le C++.
 
La plupart des classes que j'utilise dans mon moteur sont déjà sérialisées. Jusqu'à présent je n'ai jamais eu de soucis pour exporter/importer des classes dérivées car dans le .cpp qui s'en chargeait tous leurs headers étaient inclus.
 
Maintenant c'est différent, j'ai créé une nouvelle librairie qui vient se greffer sur celle en charge de la sérialisation. Et là problème, comment faire reconnaitre mes nouvelles classes? Pour vous donner un exemple:
 
Les déclarations de classe:

Code :
  1. namespace LibBase
  2. {
  3. class Base { template <class Archive> void serialize (Archive& archive,const U32); };
  4. class A : public Base { template <class Archive> void serialize (Archive& archive,const U32); };
  5. class B : public Base { template <class Archive> void serialize (Archive& archive,const U32); };
  6. class C : public Base { template <class Archive> void serialize (Archive& archive,const U32); };
  7. };
  8. namespace LibTop
  9. {
  10. class D : public LibBase::Base { template <class Archive> void serialize (Archive& archive,const U32); };
  11. };


 
 
L'export:

Code :
  1. #include "A.h"
  2. #include "B.h"
  3. #include "C.h"
  4. //#include "D.h" pas possible
  5. namespace LibBase
  6. {
  7.   void export( const Base* base, std::fstream& file )
  8.   {
  9.    boost::archive::text_oarchive outputArchive ( file );
  10.    outputArchive << serialization::make_nvp ( "base", base );
  11.   }
  12. };


 
Est-ce que je suis obligé de remonter cette fonction "export" dans LibTop en incluant tous les headers? En fait tout le problème c'est que le paramètre "Archive" est template, mais si on le connait à l'avance ya peut-être moyen d'appeler une virtuelle?

Reply

Marsh Posté le 31-01-2010 à 13:34:17   

Reply

Marsh Posté le 31-01-2010 à 17:17:14    

Y a un passage dans la doc de serialization sur ce genre de truc.
Clairement l'idée est d'avoir un fonction export template qui se charge de sérializé sur le type concret en déferrant l'appel à operator&(Archive,T)

 

Et sinon, pour ton idée, pas besoin d'inclure tout, une forward declaration pour le prototype suffira. Le sincldue sne seront necessaire que dans le .cpp de export


Message édité par Joel F le 31-01-2010 à 17:19:32
Reply

Marsh Posté le 31-01-2010 à 18:24:31    

Je ne trouve pas cette info dans la doc, est-ce que tu peux me donner le lien?
Mais visiblement je dois déclarer l'id de ma classe avec BOOST_CLASS_EXPORT_GUID avant de pouvoir sauver celle-ci. Donc j'ai peur que de toute façon remonter la fonction d'export soit la seule solution.

Reply

Marsh Posté le 31-01-2010 à 18:34:24    

Bah c'ets surtout la seule chose logique à faire.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed