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 :

Serialization d'une classe


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Serialization d'une classe
    Bonjour

    Je voudrais comprendre la methode la plus simple pour sauver le contenu d'une classe dans un fichier afin de la récupérer ensuite

    Bien sur en bon vétéran du C, je pourrais écrire cela "a la main" mais je pense quand même que .NET offre des méthodes plus intégrée

    J'ai donc essayé le code ci-dessous
    Mais qui me donne une erreur
    J'ai ensuite compris que je devais mettre la méthode GetObjectData dans ma classe

    Mais je commence a me demander si je ne fais pas fausse route
    Si quelqu'un sait comment faire simplement et peut me guider, je serais le plus heureux de ce jour !

    Merci

    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
      [Serializable()]
      public class ImportDef : ISerializable     // définition du template d'import
      {
        public string Country { get; set; } // country from import
        public UInt32 LayerID { get; set; }  // layer Id from import
        public string LayerName { get; set; } // layer name from import
        public int isValid { get; set; }       // set to 1 if definition is valid
        public bool useValue { get; set; }     // false if value is not used (meta group Only)
        public int ColCode { get; set; }       // indice colonne code
        public int ColValue { get; set; }      // indice colonne valeur
        public int ColGroup { get; set; }      // Optionnel indice colonne Groupe
        public bool optCount { get; set; }     // true if value is count of lines
        public bool optNoDup { get; set; }     // Avoid Duplicate
        public bool optGenVal { get; set; }    // Automaticaly Generate Values from Input Key
        public int HeaderRow { get; set; }     // indice row header (NoHeader = -1)
        public int FirstDataRow { get; set; }  // indice first data row (default = -1)
        public string Separators {get;set;}    // Separateurs
        public string FileName { get; set; }   // full file name
      };
    Error 1 'Ogb.Import.ImportDef' does not implement interface member 'System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)' D:\projets\MapScope.v2\Mapscope\Import\import.cs
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 201
    Points : 196
    Points
    196
    Par défaut
    Salut,

    Pour sérialiser un objet tu n'as pas besoin d'implémenter l'interface ISerializable. Mais simplement de coller l'attribut [Serializable()] en haut de ta classe.

    Lorsque tu implémente l'interface ISerializable, c'est que tu veux toit même définir le format XML de sortie.

    Enfin, ce que te dis l'erreur, c'est que tu n'implémente pas la méthode GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext) alors que tu DOIS le faire quand tu implémentes l'interface ISerializable.

  3. #3
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Tu l'as mis dans le post sur les regex.... alors je te réponds encore une fois ici...
    Pourquoi vouloir sérialiser à la main alors que cela ce fait tout seul (ou alors j'ai pas compris...)

    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
     
    public class ImportDef     // définition du template d'import
      {
        public string Country { get; set; } // country from import
        public UInt32 LayerID { get; set; }  // layer Id from import
        public string LayerName { get; set; } // layer name from import
        public int isValid { get; set; }       // set to 1 if definition is valid
        public bool useValue { get; set; }     // false if value is not used (meta group Only)
        public int ColCode { get; set; }       // indice colonne code
        public int ColValue { get; set; }      // indice colonne valeur
        public int ColGroup { get; set; }      // Optionnel indice colonne Groupe
        public bool optCount { get; set; }     // true if value is count of lines
        public bool optNoDup { get; set; }     // Avoid Duplicate
        public bool optGenVal { get; set; }    // Automaticaly Generate Values from Input Key
        public int HeaderRow { get; set; }     // indice row header (NoHeader = -1)
        public int FirstDataRow { get; set; }  // indice first data row (default = -1)
        public string Separators {get;set;}    // Separateurs
        public string FileName { get; set; }   // full file name
      };

    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ImportDef id = new ImportDef();
          XmlSerializer xs;
          StreamWriter sw;
     
          xs = new XmlSerializer(typeof(ImportDef));
          sw = new StreamWriter("C:\\temp\\ImportDef.xml", false, Encoding.Default);
          xs.Serialize(sw, id);
          sw.Close();

  4. #4
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Disons qu'il y a 2 méthodes pour sérialiser un objet: Avec ou sans l'interface ISerializable. Implémenter l'interface ISerializable permet d'avoir un controle assez fin sur la sérialisation/désérialisation.

    Dans ton cas, il me semble qu'implémenter l'interface ISerializable n'est pas nécessaire.

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Comme l'a indiqué DarkHerumor, tu as juste à placer l'attribut Serializable sur ta classe et à sérialiser. Maintenant suivant le besoin tu dois choisir la sérialisation qui convient le mieux.

    Si tu a besoin de conserver l'état de ton objet (champs privés) il faut utiliser une sérialisation binaire, sinon la sérialisation XML sera suffisante. Tu peux aussi utiliser la sérialisation binaire si jamais tu ne veux pas stocker ton objet dans un format lisible (le XML en l'occurrence).
    Pas de questions techniques par MP

  6. #6
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Ce que j'ai un peu de peine à comprendre c'est à quoi sert l'attribut Serializable alors que sans, on peut très bien sérialiser (en xml en tous cas...)

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    L'attribut Serializable est effectivement inutile pour une sérialisation XML, mais l'ajouter ne provoque pas d'erreur il me semble. Au pire c'est une ligne en trop, au mieux ça permet de savoir que la classe peut être sérialisée (si la documentation ne l'indique pas) et ça, ça peut toujours servir.
    Pas de questions techniques par MP

  8. #8
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    using System.Xml;
    using System.Text;
    using System.Xml.Serialization;
    using System.IO;
    ...
    try
    {
    // Définir l'espace mémoire où écrire
    MemoryStream xmlMemoryStream = new MemoryStream(1024);
    //l'espace mémoire
    XmlTextWriter xmlTextWriter = new XmlTextWriter(xmlMemoryStream, Encoding.UTF8);

    XmlSerializer xmlSerialiser = new XmlSerializer(this.GetType());
    xmlSerialiser.Serialize(xmlTextWriter, this);
    xmlTextWriter.Flush();
    xmlMemoryStream.Position = 0;
    StreamReader xmlStreamReader = new StreamReader(xmlMemoryStream);
    string chemin = @"C:\Test.xml";
    if (!File.Exists(chemin))
    {
    File.WriteAllText(chemin, xmlStreamReader.ReadToEnd());
    }
    }
    catch (Exception ex)
    {
    Throw ex ;
    }

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci pour vos réponse

    Effectivement, c'est encore plus simple que je ne le croyais

    En plus je pensais etre obligé de définir les accesseurs pour chaque champ de ma clase : meme pas nécessaire !

    Par contre, je vois que les string vides ne sont pas serializés ?

    Et j'imagine qu'il faut juste definir un reader et faire un deserialize pour relire le fichier dans ma classe ?

    Il y -a t-il d'autres remarques ou suggestions bonne a connaitre sur ce sujet ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

Discussions similaires

  1. Serialization d'une classe en XML
    Par rom56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2010, 16h55
  2. Réponses: 4
    Dernier message: 31/12/2009, 10h27
  3. Serialization d'une classe avec arraylist
    Par jpsegret dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 01/04/2007, 09h46
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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