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++/CLI Discussion :

C++/CLI : stockage de données d'objets de classes dérivées


Sujet :

C++/CLI

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut C++/CLI : stockage de données d'objets de classes dérivées
    Bonjour,

    Je me pose la question de savoir comment stocker dans un même fichier des objets issues de classes dérivées ..

    Voici un exemple :

    J'ai une classe CVehicule définie de la façon suivante :

    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
    #pragma once
     
    using namespace System;
     
    [Serializable]
    public ref class CVehicule
    {
    private:
        String ^ type;
        String ^ constructeur;
        String ^ modele;
    etc ...
    .
    .
    .
    Je crée une liste d'objets de cette classe que j'enregistre dans un fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String ^ strFilename = String::Concat (path, "materiel.dat");
    FileStream ^ stmMateriel = gcnew FileStream(strFilename, FileMode::Create, FileAccess::Write);
    BinaryFormatter ^ bfmMateriel = gcnew BinaryFormatter;
    bfmMateriel->Serialize(stmMateriel, materiel);  // materiel = liste d'objets de la classe CVehicule
    stmMateriel->Close();
    Jusque là tout va bien, je stocke, je lis, modifie, relis et tout fonctionne ...

    Maintenant je crée des classes "CBicyclette", "CMoto", "CVoiture", "CCamion",... dérivées de la classe CVehicule ...

    Et je me pose la question de savoir comment stocker mes objets avec une méthode aussi simple que la sérialisation ...

    Je pense que la sérialisation simple n'est pas possible car je vois mal comment dé-sérialiser des objets différents.

    Mais j'aimerais bien être sûr qu'il n'y a pas une solution simple à ce type de problème ..


    Bonne soirée et merci d'avance à ceux qui prendront la peine de me lire.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu sérialises une donnée discriminant le type (comme par exemple, le nom de la classe) avant chaque objet...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu sérialises une donnée discriminant le type (comme par exemple, le nom de la classe) avant chaque objet...
    Merci Médinoc,

    C'est déjà bien de savoir que c'est faisable et que je peux y consacrer du temps.
    Avant de poser ma question j'avais essayé (ça ne coute rien d'essayer!) mais hormis le type du véhicule (c'est déjà ça!!) je ne récupère que des zéros.

    Je me pose plusieurs questions:

    1- Quand je mets mes objets dans la list, comment déclarer la liste?
    Puis je mettre des objets CBicyclette dans une liste CVehicule
    En reprenant mon exemple, ai je le droit de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    materiel = gcnew List <CVehicule^>;
    CBicyclette ^ bicyclette = gcnew CBicyclette;
    materiel->Add (bicyclette);

    Quand je dé-sérialise, je fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FileStream ^ stmMateriel = gcnew FileStream(Filename, FileMode::Open, FileAccess::Read);
    BinaryFormatter ^ bfmMateriel = gcnew BinaryFormatter;
    materiel = (List <CVehicule^> ^) bfmMateriel->Deserialize(stmMateriel);
    stmMateriel->Close();
    for each( CVehicule ^ vehicule in materiel)
    { 
        if (vehicule->type == "Bicyclette")
        {
             CBicyclette ^ bicyclette = gcnew CBicyclette;
             ....
    Mais là comment dire que bicyclette est l'objet qui se trouve dans materiel??

    Je pense que c'est là que ça coince car il faut bien que je dise que bicyclette est le véhicule de materiel sinon il est normal que je récupère des zéros.

    Bonne soirée

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, ça fait un moment que je n'ai plus bossé sur la "vraie" sérialisation, je ne me souviens plus exactement comment on désérialise. Je vais devoir faire des tests.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    En implémentant ISerializable ?

    http://msdn.microsoft.com/en-us/libr...v=vs.100).aspx

    Mais cela implique le la classe mère connaissent ses classes filles.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Bonjour Bacelar,

    Et merci !!

    Citation Envoyé par bacelar Voir le message
    Mais cela implique le la classe mère connaissent ses classes filles.
    Qu'est ce que cela veut dire?
    Faut il déclarer les variables des classes filles dans la classe mère?

    Si c'est le cas je ne vois plus trop l'intérêt de créer des classes filles.

    J'ai regardé les liens et je sens que je vais me mélanger les pinceaux vite fait, bien fait tellement il y a de subtilités pour sérialiser et dé-sérialiser.

    J'aimerais pouvoir rester "as simple as possible" ....

    Bonne soirée et merci encore pour vos aides précieuses.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    J'aimerais pouvoir rester "as simple as possible"
    et BinaryFormatter, c'est un peu un oxymore.

    Moi, je me suis converti à la sérialisation XML.
    C'est un peu plus "simple", c'est à base d'attribut mais le problème de la connaissance des classes fille par la classe mère y est mais avec des attributs, ça passe "mieux".
    Et le résultat de la sérialisation est lisible par l'oeil humain sans un implant cybernétique "HexaEdit".

    Par "implique le la classe mère connaissent ses classes filles", c'est concrètement, que la classe mère puisse instancier ces classe filles. Oui, d'un point de vue objet, ça défrise.

    Maintenant, on peut faire dans le un peu moins simple mais plus orthodoxe.

    Le plus simple qui me vient à l'esprit, c'est de dériver "List <CVehicule^>" qui implémentera ISerializable et qui fera tout le travail d'instanciation des CVehicule et autres classes dérivées à l'extérieur de ces classes.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Par "implique le la classe mère connaissent ses classes filles", c'est concrètement, que la classe mère puisse instancier ces classe filles. Oui, d'un point de vue objet, ça défrise.

    Maintenant, on peut faire dans le un peu moins simple mais plus orthodoxe.

    Le plus simple qui me vient à l'esprit, c'est de dériver "List <CVehicule^>" qui implémentera ISerializable et qui fera tout le travail d'instanciation des CVehicule et autres classes dérivées à l'extérieur de ces classes.
    Bonsoir et merci!

    Mais là je suis complètement dans le brouillard ...

    Comment une classe mère peut instancier ses classes filles ?

    Quant à la solution moins simple, j'ai regardé Iserializable et je crois vaguement comprendre ce que vous voulez dire, mais c'est encore très confus pour moi.

    Bonne soirée

Discussions similaires

  1. Stockage en base de données d'objets sérialisés
    Par MagnetiK dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 07/06/2011, 08h52
  2. Stockage de données
    Par moa378 dans le forum OpenGL
    Réponses: 16
    Dernier message: 26/05/2005, 14h34
  3. Stockage de données cartographiques en BDD
    Par Mack.51 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/06/2004, 12h48
  4. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05
  5. [SGBDOO] Base de données orientée objet
    Par Jaona dans le forum Décisions SGBD
    Réponses: 19
    Dernier message: 14/04/2003, 11h07

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