Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3570 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [boost.serialization] Sérialization, templates et pointeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[boost.serialization] Sérialization, templates et pointeurs

n°2013459
codablank
Posté le 01-08-2010 à 22:58:15  profilanswer
 

Bonjour, je souhaite sérialiser une classe avec en attribut une liste de pointeurs sur une classe générique
 
Tout d'abord la classe mère dont dérive la classe générique
 

Code :
  1. class Base{
  2. public :
  3.     friend class boost::serialization::access;
  4.     virtual ~Base(){}
  5.     template<class Archive>
  6.     void serialize(Archive & ar, const unsigned int version)
  7.     {
  8.     }
  9.         virtual string Getid() = 0 ;
  10. };


 
la classe générique :  
 

Code :
  1. template<typename T>
  2. class GenericBase : public Base
  3. {
  4.     public:
  5.         friend class boost::serialization::access;
  6.         GenericBase<T>(string id){}
  7.        ~GenericBase(){}
  8.        string id;
  9.        vector<T> data
  10.      
  11.        template<class Archive>
  12.        void serialize(Archive & ar, const unsigned int version)
  13.             {
  14.                 ar & boost::serialization::base_object<Base>(*this);
  15.                 ar & BOOST_SERIALIZATION_NVP( id);
  16.                 ar & BOOST_SERIALIZATION_NVP( data);
  17.             }
  18.         string Getid() { return id; }
  19. };


 
la classe que je veux sérialiser :
 

Code :
  1. class Use
  2. {
  3. public:
  4.             friend class boost::serialization::access;
  5.             int Id;
  6.             map<string, Base*> BaseDatas;
  7.             Use();
  8.             ~Use();
  9. };


 
après lecture de la doc de boost sur le sujet  (http://www.boost.org/doc/libs/1_43 [...] edpointers), j'ai tenté ce code :
 

Code :
  1. main(){
  2. //SAVE
  3. Use u = Use();
  4. std::ofstream ofs(filename, ios::binary);
  5. // save data to archive
  6. boost::archive::binary_oarchive oa(ofs);
  7. oa.template register_type<GenericBase<Type1> >();
  8. oa.template register_type<GenericBase<Type2> >();
  9. oa.template register_type<GenericBase<Type3> >();
  10. oa<<u;
  11. }


 
je me ramasse

Code :
  1. error: 'template' (as a disambiguator) is only allowed within templates

, alors je remplace

Code :
  1. "oa.template register_type<GenericBase<Type1> >()"

par

Code :
  1. "oa.register_type<GenericBase<Type1> >();


 
et ça passe mais j'ai des doutes sur la validité de cette syntaxe
 
à partir de là je peux sauver en text et en binary (j'ai vérifié l'intégrité des données)
 
ensuite j'ai essayé le chargement de la même manière
 

Code :
  1. main(){
  2. Use u;
  3. std::ifstream ifs(filename, ios::binary);
  4. // load data
  5. ia.register_type<GenericBase<Type1> >();
  6. boost::archive::binary_iarchive ia(ifs);
  7. ia>>u;
  8. }


 
mais las,

Code :
  1. error: no matching function for call to 'GenericBase<float>::GenericBase()'


 
sur un autre forum on me dit que je dois surcharger les méthodes save_construct load_construct telles que dans l'exemple http://www.boost.org/doc/libs/1_43 [...] nstructors afin d'infiquer à Boost comment créer un objet de ce type  
 
mais ou dois je les déclarer ? dans la déclaration de GenericBase, dans celle de Use ?
 
Et comment faire avec le membre map<string, Base*> BaseDatas; ?  
 
D'avance merci de votre aide  :jap:

mood
Publicité
Posté le 01-08-2010 à 22:58:15  profilanswer
 

n°2015160
el muchach​o
Comfortably Numb
Posté le 07-08-2010 à 22:44:19  profilanswer
 

hé bé, pour ces trucs là, vive le Java, quoi :/


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2015222
codablank
Posté le 08-08-2010 à 18:46:09  profilanswer
 

cool comme réponse, exactement ce qu'il me fallait   :sleep:  
 
on sent la qualité ici  :o

n°2015250
el muchach​o
Comfortably Numb
Posté le 09-08-2010 à 07:25:20  profilanswer
 

Je ne connais rien à Boost, et j'ai pas lu la doc , donc je doute de pouvoir t'aider, mais je ne comprends  pas ton code, je ne comprends pas comment ça peut marcher.
Intuitivement, j'aurais tenté:

 

oa.template register_type<GenericBase<Use> >();

 

Mais si on t'a répondu dans l'autre forum, t'as p-ê intérêt à creuser le sujet la-bas.


Message édité par el muchacho le 09-08-2010 à 07:34:27

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [boost.serialization] Sérialization, templates et pointeurs

 

Sujets relatifs
pointeurs dans un conteneur - comment éviter leur destruction ?Passage d'un tableau de pointeurs de fonctions en argument
Boost et mutexBoost lambda et objet complexe
[boost] Parsing de fichiers simples mais très gros[boost::serialization] Serialization de classes "inconnues"
tableaux de pointeursBoost.preprocessor
BOOST_PP : concatener un caractère spécial 
Plus de sujets relatifs à : [boost.serialization] Sérialization, templates et pointeurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR