IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Boost serialize xml et class template


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut Boost serialize xml et class template
    Bonjour,

    Je souhaite utiliser boost::serialize dans un projet mais j'ai des problèmes avec les classe template:

    Je dispose d'une classe template de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    template<class T>
    class Tclass {
     
    	friend class boost::serialization::access;
        template<class Archive>
        inline void serialize(Archive & ar, const unsigned int version)
        {
    		ar & BOOST_SERIALIZATION_NVP(m_Value);
        }
     
    public:
    	T m_Value;
    	Tclass(T value) { m_Value = value; }
    };
    et d'une autre classe template dérivant de cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    template<class T>
    class TclassDeriv : public Tclass<T> {
     
    	friend class boost::serialization::access;
        template<class Archive>
        inline void serialize(Archive & ar, const unsigned int version)
        {
    		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Tclass<T>);
    		ar & BOOST_SERIALIZATION_NVP(m_Value2);
        }
     
    public:
    	T m_Value2;
    	TclassDeriv(T value1, T value2) : Tclass<T>(value1) { m_Value2 = value2; }
    };
    Je crée ensuite un élément TclassDeriv<int> dans le main et je le serialise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <boost/archive/xml_woarchive.hpp> // saving
    #include <boost/archive/xml_wiarchive.hpp> // loading
    #include <boost/serialization/nvp.hpp>
    #include <boost/serialization/version.hpp>
    #include <boost/serialization/base_object.hpp>
    #include <boost/serialization/export.hpp>
    #include <boost/serialization/string.hpp>
    #include <boost/serialization/list.hpp>
    #include <boost/serialization/vector.hpp>
    #include <boost/serialization/map.hpp>
     
    int main()
    {
    	Tclass<int> A(25);
    	cout << A.m_Value << endl;
    	TclassDeriv<int> Ad(0,1);
    	cout << Ad.m_Value << endl;
    	cout << Ad.m_Value2 << endl;
     
    	std::wofstream ofs("C:\\Data\\test.xml");
            assert(ofs.good());
            boost::archive::xml_woarchive oa(ofs);
            oa << BOOST_SERIALIZATION_NVP(Ad);
     
    	return 0;
    }
    Le code compile bien et affiche:

    25
    0
    1

    mais il plante au moment de serialiser.

    Auriez vous une idée de ce qui ne va pas?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Bon après un bon bout de temps passé dessus, j'ai trouvé la solution:

    Il ne faut pas mettre les paramètre de template dans les macros BOOST_SERIALIZATION_BASE_OBJECT_NVP

    En remplacant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOST_SERIALIZATION_BASE_OBJECT_NVP(Tclass<T>);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BOOST_SERIALIZATION_BASE_OBJECT_NVP(Tclass);
    et en ajoutant un constructeur par défaut vide dans chaque classe:
    et
    tout fonctionne correctement.


    Bonne journée,
    Emmanuel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boost serialize XML
    Par micou dans le forum Boost
    Réponses: 3
    Dernier message: 05/12/2010, 09h38
  2. Serialization d'une classe en XML
    Par rom56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2010, 16h55
  3. Réponses: 4
    Dernier message: 31/12/2009, 10h27
  4. Réponses: 5
    Dernier message: 30/12/2009, 16h58
  5. Réponses: 2
    Dernier message: 14/11/2009, 02h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo