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 :
- class Base{
- public :
- friend class boost::serialization::access;
- virtual ~Base(){}
- template<class Archive>
- void serialize(Archive & ar, const unsigned int version)
- {
- }
- virtual string Getid() = 0 ;
- };
|
la classe générique :
Code :
- template<typename T>
- class GenericBase : public Base
- {
- public:
- friend class boost::serialization::access;
- GenericBase<T>(string id){}
- ~GenericBase(){}
- string id;
- vector<T> data
-
- template<class Archive>
- void serialize(Archive & ar, const unsigned int version)
- {
- ar & boost::serialization::base_object<Base>(*this);
- ar & BOOST_SERIALIZATION_NVP( id);
- ar & BOOST_SERIALIZATION_NVP( data);
- }
- string Getid() { return id; }
- };
|
la classe que je veux sérialiser :
Code :
- class Use
- {
- public:
- friend class boost::serialization::access;
- int Id;
- map<string, Base*> BaseDatas;
- Use();
- ~Use();
- };
|
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 :
- main(){
- //SAVE
- Use u = Use();
- std::ofstream ofs(filename, ios::binary);
- // save data to archive
- boost::archive::binary_oarchive oa(ofs);
- oa.template register_type<GenericBase<Type1> >();
- oa.template register_type<GenericBase<Type2> >();
- oa.template register_type<GenericBase<Type3> >();
- oa<<u;
- }
|
je me ramasse
Code :
- error: 'template' (as a disambiguator) is only allowed within templates
|
, alors je remplace
Code :
- "oa.template register_type<GenericBase<Type1> >()"
|
par
Code :
- "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 :
- main(){
- Use u;
- std::ifstream ifs(filename, ios::binary);
- // load data
- ia.register_type<GenericBase<Type1> >();
- boost::archive::binary_iarchive ia(ifs);
- ia>>u;
- }
|
mais las,
Code :
- 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