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 Serialization pointeur


Sujet :

Boost C++

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 106
    Points
    106
    Par défaut Boost Serialization pointeur
    Si quelqu un peut me dire si on peut faire ca avec la boost et comment:

    On a 4 objets :
    - ObjA
    - ObjB
    - ObjC
    - ObjAC
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    //__________________________________________________________
    //
    //                             OBJ A
    //__________________________________________________________
     
    class ObjA
    {
    public:
    	ObjA(void);
    	ObjA(ObjB& objB);
    	~ObjA(void);
    	string name;
    	int id;
     
    	ObjB* myObjBInA;
     
    	friend class boost::serialization::access;
    	template<class Archive>
                 void serialize(Archive & ar, const unsigned int /* file_version */)
    	{
    		using boost::serialization::make_nvp;
    		ar & make_nvp("nameObjA",name);
    		ar & make_nvp("IdObjA",id);
    		ar & make_nvp("ObjBInA",myObjBInA);
     
        }
    };
    //__________________________________________________________
    //
    //                             OBJ B
    //__________________________________________________________
     
    class ObjB
    {
    public:
    	ObjB(void);
    	~ObjB(void);
     
    	string name;
    	int id;
     
    	friend class boost::serialization::access;
    	template<class Archive>
                 void serialize(Archive & ar, const unsigned int /* file_version */)
    	{
    		using boost::serialization::make_nvp;
    		ar & make_nvp("nameObjB",name);
    		ar & make_nvp("IdObjB",id);
        }
    };
    //__________________________________________________________
    //
    //                             OBJ C
    //__________________________________________________________
     
    class ObjC
    {
    public:
    	ObjC(void);
    	~ObjC(void);
     
    	string name;
    	int id;
     
    	ObjB* ptrObjBInA;
     
    	void write(ostream& out) const ;
    	void read(istream& in);
     
    	friend class boost::serialization::access;
    	template<class Archive>
                 void serialize(Archive & ar, const unsigned int /* file_version */)
    	{
    		using boost::serialization::make_nvp;
    		ar & make_nvp("nameObjC",name);
    		ar & make_nvp("IdObjC",id);
    		ar & make_nvp("ptrObjBInA",ptrObjBInA);
     
        }
    };
    //__________________________________________________________
    //
    //                             OBJ AC
    //__________________________________________________________
     
    class ObjAC
    {
    public:
    	ObjAC(void);
    	~ObjAC(void);
     
    	ObjA* myObjA;
    	ObjC* myObjC;
     
    	void ObjAC::write(ostream& out) const ;
    	void ObjAC::read(istream& in) ;
     
    	friend class boost::serialization::access;
    	template<class Archive>
                 void serialize(Archive & ar, const unsigned int /* file_version */)
    	{
    		using boost::serialization::make_nvp;
    		ar & make_nvp("ObjA",myObjA);
    		ar & make_nvp("ObjC",myObjC);
        }
     
    };
     
    //____________________________________________________
    //
    //				BOOST XML
    //____________________________________________________
    void ObjAll::write(ostream& out) const 
    { 
    	cout<<"WRITE XML OBJALL WITH BOOST "<<endl;
    	boost::archive::xml_oarchive oa(out);
    	using boost::serialization::make_nvp;
    	oa <<BOOST_SERIALIZATION_NVP(myObjA);
    	oa <<BOOST_SERIALIZATION_NVP(myObjC);
    }
    void ObjAll::read(istream& in) 
    { 
    	cout<<"READ XML OBJALL  WITH BOOST "<<endl;
    	boost::archive::xml_iarchive ia(in);
    	using boost::serialization::make_nvp;
    	ia >>BOOST_SERIALIZATION_NVP(myObjA);
    	ia >>BOOST_SERIALIZATION_NVP(myObjC);
    }


    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
    28
     
     
    ObjA objA;
    objA.name = "ObjAName";
    objA.id = 0;
     
    ObjB objB;
    objB.name = "ObjBName";
    objB.id = 1;
     
    ObjC objC;
    objC.name = "ObjCName";
    objC.id = 2;
     
    ObjAC objAC;
     
     
    objA.myObjBInA = &objB;
    objC.ptrObjBInA = &objB;
     
     
    objAC.myObjA = &objA;
    objAC.myObjC = &objC;
     
    std::string filename = "D:\\TEST\\BoostSerializationTest.xml";
    std::ofstream ofs(filename.c_str());
     
    objAC.write(ofs);
    Le cas a traiter ,on a :

    ObjAC:
    -ObjA* ------------> OBJA : ObjB*

    -ObjC*--------------> ObjC : ObjB*

    Avec les 2 classes ObjA et ObjC qui pointent sur le meme objet B.
    Comment serialiser l'objet AC, en serialisant qu un seul fois l´objet B ?

    Il doit avoir un moyen de dire a boost que j ai 2 references sur un meme objet (ObjB) et donc de serialiser qu une seul fois l objet B.

    J ai tester de seraliser une liste de pointeur d objet, en mettant dans le liste 2 fois la meme adresse et ca fonctionne bien. Boost serialise qu une seule fois l objet pointe, et cree 2 pointeurs sur cet obj. Mais c est le meme contener.
    (cf object_id="_UnNombre")

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Peut-être ce débrouillerait-il mieux si tes classes utilisé des shared_ptr ?
    En l'occurence, il faut qu'il sérialise une fois B avant de serialisé tes deux classes. Cela me parait complexe, mais peut-être.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    tu as jeté un coup d'oeil à ce tuto : Boost.Serialization : La sérialisation avec Boost ? Peut être que ça peut t'aider.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    avec boost serialization tu peux le faire sans problèmes

    regarde mon post sur boost serialization XML, c'est presque pareil que boost serialisation tout court: http://www.developpez.net/forums/d84...serialisation/

    A la fin je donne un exemple de serialisation de classes dérivées. ainsi que les méthodes pour les serialiser et deserialiser.

    le tuto mis en lien par 3dArchi est tres bein mais il y a quelques lacunes comblé par mon exemple

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Merci pour les tuto mais vous devez bien vous douter que j ai lu avant les tuto de la Boost qui sont tres bien fait.


    Ensuite, je me pose la question de savoir si vous avez lu mon pb ou si vous avez juste lu le titre, et pour faire augmenter le nbre de vos reponses, faire un copy past de lien vers des tutos qui ne correspondent pas a ma question.

    Donc je souhaiterais m'adresser au gens interesses par le sujet et qui ont lu la problematique.
    Je la rappelle, 2 objets differents ont chacun un pointeur sur un autre meme objet. ( ObjA --> ObjB et ObjC --> ObjB)
    Comment en serialisant les 3 objets je peux eviter de deserialiser 2 fois l objet commun.( serialiser seulement ObjA,ObjC,ObjB et non pasObjA,ObjB ObjC,ObjB)

  6. #6
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    ...
    Elle te vas pas ma solution oO ?
    Moi aussi j'ai un lien !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par pavel Voir le message
    Merci pour les tuto mais vous devez bien vous douter que j ai lu avant les tuto de la Boost qui sont tres bien fait.


    Ensuite, je me pose la question de savoir si vous avez lu mon pb ou si vous avez juste lu le titre, et pour faire augmenter le nbre de vos reponses, faire un copy past de lien vers des tutos qui ne correspondent pas a ma question.

    Donc je souhaiterais m'adresser au gens interesses par le sujet et qui ont lu la problematique.
    Je la rappelle, 2 objets differents ont chacun un pointeur sur un autre meme objet. ( ObjA --> ObjB et ObjC --> ObjB)
    Comment en serialisant les 3 objets je peux eviter de deserialiser 2 fois l objet commun.( serialiser seulement ObjA,ObjC,ObjB et non pasObjA,ObjB ObjC,ObjB)
    Effectivement j'ai lu trop vite (ou pas assez en détail) ta question
    Essai la solution de Lavock: remplace tes pointeurs par des pointeurs intelligents de boost(boost::shared_ptr<T>) Les pointeur intelligents permettent le partage de référence et la gestion transparentes des pointeurs.
    A par ajouter quelques #include . Ça ne changera pas trop ton code.
    A part cette solution je n'ai pas d'idée à te proposer.
    Je pense même que le doublon est inévitable puisque la ou il y a les données de serilisation chaque classe A et B possède les données de C

    Sinon pourquoi veux tu absolument que l'objet en commun ne sois serialisé qu'une seul fois?

  8. #8
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Syl_20 , je te remercie de ta reponse.

    Sinon pourquoi veux tu absolument que l'objet en commun ne sois serialisé qu'une seul fois?
    En fait je suis sur aussi sur un pb d optimisation de taille de fichier.
    Je suis en train de developper (faire le design pour le moment) d une appli qui va fonctionner avec datasynapse (grid computing). L idee c est de mettre les donnees statiques dans un fichier binaire (pour les test en XML). Ce fichier va etre repliquer sur chaque machine.
    Donc le but c est de minimiser le plus possible la taille des fichiers.

    Le pb de la sol de Lavock c est qu il faut retoucher tout le code que je dois serialiser. Ce qui represente enormement de classe. Je cherche donc une solution plus rapide.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par pavel Voir le message
    Syl_20 , je te remercie de ta reponse.



    En fait je suis sur aussi sur un pb d optimisation de taille de fichier.
    Je suis en train de developper (faire le design pour le moment) d une appli qui va fonctionner avec datasynapse (grid computing). L idee c est de mettre les donnees statiques dans un fichier binaire (pour les test en XML). Ce fichier va etre repliquer sur chaque machine.
    Donc le but c est de minimiser le plus possible la taille des fichiers.

    Le pb de la sol de Lavock c est qu il faut retoucher tout le code que je dois serialiser. Ce qui represente enormement de classe. Je cherche donc une solution plus rapide.

    Test la solution de Lavok sur un exemple bidon, si ce n'est déjà fait. J'ai un doute sur le fait qu'elle fonctionne.
    Sinon tu peu faire plusieurs fichiers au lien d'un seul. C est sérialisédans un fichier et quand tu sérialises A et B tu n'y met que le chemin du fichier de C.
    Aussi avec boost tu peux sérialisé dans des fichiers binaires au lieu de fichiers textes. Ça prend moins de place.

Discussions similaires

  1. Boost Serialization / pointeurs / polymorphisme
    Par Feriaman dans le forum Boost
    Réponses: 2
    Dernier message: 27/07/2011, 05h50
  2. Réponses: 5
    Dernier message: 30/06/2011, 13h38
  3. Réponses: 2
    Dernier message: 10/03/2011, 00h44
  4. boost::serialization et pointeur
    Par guillaume07 dans le forum Boost
    Réponses: 2
    Dernier message: 12/07/2010, 10h15
  5. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03

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