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

C++ Discussion :

serialisation


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut serialisation
    Slutation ami(e)s

    Pouvez m'eclairer sur quelque petit point.

    Quelle sont les principe de la serialisation ?
    En gros comment ca fonctionne et quelle est la difference avec une ecriture binaire

    je rechercche des information pour ecrire une classe de serialisation


    merci

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Les grands points sont traités dans la FAQ C++ lite.
    Il existe déjà des bibliothèques de sérialization (et non ce n'est pas une tâche simple, si on veut un truc générique et non verbeux à l'utilisation). Chez boost, il y en a une de portable.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Si mes souvenir sont bons, c'est le fait de sauvegarder un objet, tout simplement, donc au finish, ses différents arguments. Une écriture binaire (qui est au finsih une sorte de sérialisation) serait un "dump" brutal dans un fichier de la structure de donnée correspondant à l'objet en mémoire (à ce niveau, faut faire gaffe à la vtable !!!). La sérialisation, elle, est plutôt l'écriture de chacun des champs de l'objet, typiquement dans une base de données (mais pourquoi pas un fichier XML, ou que sais-je...)

    Une classe de sérialisation, c'est une interface avec la base, quelle qu'elle soit. On a donc une classe (je l'avais nommée DBInterface, et c'était un singleton) dans un projet, qui sait lire/écrire des champs dans une table (e.g. méthode query() / add()), et toutes les classes sérialisable possède des méthode, e.g. dump() / load(). Pour faire propre, les objets sérialisables peuvent (doivent?) hériter d'une classe abstraite qui possède ces deux méthode (dump() / load()) virtuelles pures.

    Pour simplifier mon propos, j'essplik kess javé fé (c'était un projet en Java à l'école):
    La classe DBInterface (singleton) était instanciée au lancement de l'appli, elle réalisait la connexion avec la BD distante.

    Ensuite, chaque objet qui voulait se sérialiser (on pouvait rajouter des fiches d'état civil de prof et d'élèves en l'occurence), utilisait l'instance de DBInterface pour :
    1) créer une nouvelle fiche dans la table qui correspondait à sa classe. Elle recevait alors un ID unique (géré par la base).
    2) renseigner chacun des champs de la fiche (bijection avec les attributs de l'objet) en fournissant son ID, le nom de l'attribut, et sa valeur.

    Ou encore au lancement de l'application :
    -Récupérer l'ensemble des ID existant pour une classe donnée
    -Créer une instance par ID : le constructeur surchargé appelait load(), qui lui même utilisait DBInterface::get()->query() en fournissant l'ID de l'objet pour initialiser les différent attributs.

    En l'occurence nous utilisions une BD SQL, ce qui réduisait DBinterface à la connexion / décox, et la translation des appel à query() / add() vers des requêtes SQL.

    Voilà mes souvenir, p'têt bien imprécis, mais j'éspère éclairant.

    Et tiens, luc à répondu pendant que je rédigeais...
    Gaïa n'est pas une marchandise.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    merci je vais etudier tout ca

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Sérialiser, c'est l'échange qui permet de sauver et restorer un objet et son état. Que le média soit un fichier xml, "binaire", csv, tartanpion, ou même un flux réseau n'est qu'un détail.

    Ah. Et il y a des frameworks de sérialisation qui sont non intrusifs -> pas besoin de dériver d'une classe particulière. C'est le cas de boost.serialization.

    Et tiens, luc à répondu pendant que je rédigeais...
    Ah! Ca m'arrive souvent ça 8)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    ces bien mais il y a quand des chauses que je ne pige pas bien

    si l'un des member de ma classe est un pointeur sur un object
    la valeur reel du pointeur represente la position physique de l'object en memoire l'orsque je vais <<deserialiser>> mon object rien ne me dit que l'object precedement pointer ce repositionneras au meme endroit en memoire ???? donc mon pointeur ne sera pas valide...


    si il vous semble que ma question manque de clarete dite vous que ces pareille pour moi

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    b si tu as un pointeur, tu sérialises ce qu'il pointe, je ne vois pas le problème

    sous VisualC++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // MaClasse * ptr;
    void Serialize(CArchive & ar)
    {
      if (ar.IsStoring())
      {
         ar << *ptr;
      }
      else
      {
        ar >> *ptr;
      }
    }
    je ne vois pas en quoi le fait que l'objet ne soit pas au même emplacement mémoire est un soucis

  8. #8
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Tu remplace la valeur du pointeur par l'ID de l'objet pointé...
    Mais attention aux dépendences lors du rechargement !!!

    Dis Luc ? T'es impliqué dans Boost ou quoi ? En tout cas on dirais... Vu ta connaissance du truc... Et la pub que t'en fait !!! (Dzol pour mon ignorance, même si mon inscription date, ça fait que qq jours que je reviens sur le forum, bcp trop occupé ces derniers temps...)
    Gaïa n'est pas une marchandise.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour faire ce que tu dis, typiquement, la classe à sérialiser va indiquer à la bibliothèque de sérialisation qu'elle contient un pointeur sur une autre classe (dont elle ne connait éventuellement pas le type réel en cas de polymorphisme). La bibliothèque va donc vérifier dans la liste des classe qu'elle a déjà sérialisé si l'adresse si l'adresse de la sous classe s'y trouve.

    Si non, elle sérialise la sous classe (en indiquant son type réel), en lui associant un identificateur unique, indique dans la sérialisation de la première classe que la sous classe correspondra à cet identificateur, et ajoute cette classe dans la liste des classes déjà traitées.

    Si oui, elle récupère l'identifiant utilisé précédemment et l'ajoute dans la première classe.

    Pour la lecture, c'est pareil dans l'autre sens.

    Une bibliothèque comme boost permet d'oublier tous ces détails scabreux, et pour sérialiser une classe comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A
    {
      vector<B*> v;
      B* p;
      B* p2[15];
    };
    (avec B classe abstraite avec des classes dérivées sérialisables)

    Il suffit d'écrire un code comme (je sais plus la syntaxe exacte):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class Archive>
    void serialize(Archive ar, const unsigned int version)
    {
      ar & v & p & p2;
    }
    Et "magiquement", lecture et écriture sont gérés. C'est vraiment une bibliothèque très impressionnante.

    --
    Loïc
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    tu sérialises ce qu'il pointe, je ne vois pas le problème
    en effait il y a pas de probleme et ces ce que je fait abituellement mais
    prenom le cas suivant

    si j'ai 100 object qui ont un membre pointeur sur une seul instance d'un autre object si je serialize mon object + ce qu'il pointe je vais serialiser 100 fois le meme object non???(je peut etre dans les patate)

    a mon sence il y a moyen de faire mieux??? mais j'en suis pas sure

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par SKZ81
    Dis Luc ? T'es impliqué dans Boost ou quoi ? En tout cas on dirais... Vu ta connaissance du truc... Et la pub que t'en fait !!!
    Boost contient de véritable joyaux. Passer à côté de nos jours serait vraiment dommage. Donc quand on a découvert ça :

    1/ On essaie de mieux comprendre
    2/ On conseille à d'autre
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Ok j'ai jamais critiqué une lib sans la comprendre... Et le fait de la recommander en diverses circonstance prouve ses capacités !!! Je voulais juste savoir qui en étai(en)t l'auteur(s)... Quoi de mal à ça ??? Milles excuses si mes propos sont éronnés -ou pire, injurieux- (mais dans le cas présent, je ne crois pas). Mon interpellation se voulais plus une proposition d'"analyse psychologique du propos" si vous voyez ce qu'j'veux dire
    Gaïa n'est pas une marchandise.

  13. #13
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par philippe V
    tu sérialises ce qu'il pointe, je ne vois pas le problème
    en effait il y a pas de probleme et ces ce que je fait abituellement mais
    prenom le cas suivant

    si j'ai 100 object qui ont un membre pointeur sur une seul instance d'un autre object si je serialize mon object + ce qu'il pointe je vais serialiser 100 fois le meme object non???(je peut etre dans les patate)

    a mon sence il y a moyen de faire mieux??? mais j'en suis pas sure
    ok je vois ce que tu veux dire. je me suis trouvé dans un cas similaire. une classe avec un membre singleton.
    dans mon cas, je ne serialise pas le singleton, il est recréé si lorsque je lis l'objet le singleton n'existe pas.

    pour ton cas, je ne sais pas

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par SKZ81
    Dis Luc ? T'es impliqué dans Boost ou quoi ? En tout cas on dirais... Vu ta connaissance du truc... Et la pub que t'en fait !!!
    Nullement. Je ne suis qu'un modeste utilisateur. Les auteurs sont plein de gens divers et variés dont les propositions sont soumises à revue (à d'autres développeurs) avant acceptation.

    Je rejoins un peu le commentaire de Loïc : quand on connait une solution qui répond proprement et efficacement à un problème posé, on la signale.
    Même s'il s'agit d'un exercice, les exemples (de libs déjà implémentées) de comment cela s'utilise, quand, et parfois même les docs de conception, sont des informations qu'il est bon de regarder.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par SKZ81
    Milles excuses si mes propos sont éronnés -ou pire, injurieux- (mais dans le cas présent, je ne crois pas).
    Je ne les avais pas pris comme tels. Désolé si ma réponse peut paraître rude.

    Quant à savoir qui est derrière boost, c'est difficile. En fait, boost n'est pas une bibliothèque, mais une bibliothèque de bibliothèque. Le projet est à l'initiative de membres du commité de normalisation du C++, mais tout le monde peut y participer.

    En l'occurence, la personne derrière la bibliothèque de sérialisation est Robert Ramey, et sur http://www.boost.org/libs/libraries.htm les contributeurs principaux sont cités pour chaque bibliothèque.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par bigboomshakala
    b si tu as un pointeur, tu sérialises ce qu'il pointe, je ne vois pas le problème

    sous VisualC++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // MaClasse * ptr;
    void Serialize(CArchive & ar)
    {
      if (ar.IsStoring())
      {
         ar << *ptr;
      }
      else
      {
        ar >> *ptr;
      }
    }
    je ne vois pas en quoi le fait que l'objet ne soit pas au même emplacement mémoire est un soucis

    Oui mais le code donné est spécifique MFC......

  17. #17
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    oui je sais

    mais c'était juste pour illustrer le fait que pointeur sur objet ou directement l'objet ça ne pose aucun problème.

  18. #18
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Question. Tu veux t'implémenter une sérialisation pour raison d'exercice (personnel ou non), ou bien tu as besoin de sérialisation dans le cadre d'une appli que tu développes ?

    (car cette question de pointeur est résolue et je crois même expliquée dans boost.serialization)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  19. #19
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par bigboomshakala
    oui je sais

    mais c'était juste pour illustrer le fait que pointeur sur objet ou directement l'objet ça ne pose aucun problème.
    Restons Zen ce que je voulais dire c'est que c'est un des avantages des MFC car tout est déjà prêvu d'avance .
    Mais c'est un autre sujet .....

  20. #20
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par mat.M
    Restons Zen
    no problemo

Discussions similaires

  1. [debutant][serialisation ][jtable]pb de sauvegarde
    Par ould dans le forum Composants
    Réponses: 19
    Dernier message: 20/07/2004, 09h09
  2. [Concept][Sérialisation] XML ou serializable
    Par christopheJ dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 03/06/2004, 13h11
  3. est il possible de serialiser un composant visuel ?
    Par uliss dans le forum C++Builder
    Réponses: 12
    Dernier message: 15/04/2004, 10h22
  4. [VB6]Sérialiser un objet
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 11/10/2003, 10h05
  5. Serialiser de gros documents XML
    Par philemon_siclone dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 17/09/2003, 15h26

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