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

Windows Forms Discussion :

Serialization d'une classe en XML


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Serialization d'une classe en XML
    Bonjour,

    J'essaye de me battre avec la serialisation en XML mais sans succès, après plein d'erreurs, j'arrive à obtenir un fichier XML mais ou il n'y a pas les infos!

    Je veux enregistrer des contact j'ai donc une classe Contact et une classe ContactCollection qui contient une liste de tous les contacts. Ensuite je sérialize la classe ContactCollection.

    Je vous laisse regarder le code, ce sera plus explicite! Quelqu'un pourrait-il m'aider??

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System;
    using System.Collections;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace WindowsFormsApplication1
    {
                    
        public partial class main : Form
        {
            public contactCollection liste = new contactCollection();
            public add AddWindows;
    
            public main()
            {
      
            
            }
    
          
    
         
    
            private void buttonExport_Click(object sender, EventArgs e)
            {
                // on ouvre le fichier
                DialogResult resultDial = saveXMLFileDialog.ShowDialog();
                if (resultDial == DialogResult.OK)
                {
                    // creation du flux
                    TextWriter flux = new StreamWriter(saveXMLFileDialog.FileName);
    
                    // on ecrit la liste dans un fichier XML
                     XmlSerializer s = new XmlSerializer( typeof( contactCollection ) );
                    TextWriter w = new StreamWriter( @"z:\list.xml" );
                    s.Serialize( w, liste );
                    w.Close();
                }
            }
    
            private void main_Load(object sender, EventArgs e)
            {
    
            }
    
            private void buttonAddContact_Click(object sender, EventArgs e)
            {
                AddWindows.ShowDialog();
            }
        }
    
        [XmlRoot("contactCollection")]
        public class contactCollection
        {
     
            private ArrayList AllContacts; //contacts est une liste de Contact
    
    
            public contactCollection()
            {
                AllContacts = new System.Collections.ArrayList();
            }
    
            [XmlElement("contact")]
            public contact[] contacts
            {
                get
                {
                    contact[] contacts = new contact[AllContacts.Count];
                    AllContacts.CopyTo(contacts);
                    return contacts;
                }
            }
    
            public void addContact(contact c)
            {
                AllContacts.Add(c); // Ajoute un contact à la liste
            }
    
           
        }
        [Serializable]
        public class contact
        {
            [XmlAttribute("nom")]  public string nom;
            [XmlAttribute("prenom")]    public string prenom;
            [XmlAttribute("email")] public string email;
            
    
            public contact()
            {
            }
    
           
    
            public contact(string nom, string prenom, string email)
            {
                // init des parametres
                this.nom = nom;
                this.prenom = prenom;
                this.email = email;
            }
      
    
    
            
    
    
        }
    
     
    
       
    }
    Merci beaucoup !

  2. #2
    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
    Comme c'est encore fete, je vais te suggerer une autre piste plus simple
    Un conseil en plus : utilise des List<T> plutot que des ArayList


    Ici il y a de quoi faire ton bonheur

    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
      // ***************************************************************************
      /// <summary>
      /// Info véhicules
      /// </summary>
      public class C_Vehicule
      {
        public string Name { get; set; }
        public string Driver { get; set; }
        public string SimID { get; set; }
        public DateTime FirstRun;
        public DateTime LastRun;
     
        public C_Vehicule()
        {
        }
     
        public C_Vehicule(string _name)
        {
          this.Name = _name;
          this.Driver = string.Empty;
        }
      }
      // ***************************************************************************
      public class C_VehiculeList : List<C_Vehicule>
      {
     
        public void SaveXml(string File)
        {
          XmlWriterSettings xmlSettings = new XmlWriterSettings();
          xmlSettings.CloseOutput = true;
          xmlSettings.ConformanceLevel = ConformanceLevel.Document;
          xmlSettings.Indent = true;
     
          StreamWriter fs = new StreamWriter(File);
          XmlWriter writer = XmlWriter.Create(fs, xmlSettings);
          XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
          ns.Add("", "");
          XmlSerializer xs = new XmlSerializer(typeof(C_VehiculeList));
          xs.Serialize(writer, this, ns);
          writer.Close();
          fs.Close();
        }
        public C_VehiculeList LoadXml(string FileName)
        {
          C_VehiculeList L = null;
     
          if (!File.Exists(FileName))
          {
            return null;
          }
          try
          {
            using (StreamReader fs = new StreamReader(FileName))
            {
              XmlReaderSettings xmlSettings = new XmlReaderSettings();
              xmlSettings.CloseInput = true;
              xmlSettings.IgnoreWhitespace = true;
              xmlSettings.ConformanceLevel = ConformanceLevel.Document;
              xmlSettings.CloseInput = false;
              XmlReader reader = XmlReader.Create(fs, xmlSettings);
     
     
              XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
              ns.Add("", "");
              XmlSerializer xs = new XmlSerializer(typeof(C_VehiculeList));
              L = (C_VehiculeList)xs.Deserialize(reader);
              reader.Close();
              fs.Close();
            }
          }
          catch
          {
          }
          return L;
        }
      }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Super merci je test demain

    Bonne soirée, je te tiens au courant!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    L'origine de ton problème est que dans ta classe contactCollection, la seule propriété publique est contacts, et elle est en lecture seule : elle ne sera donc pas sérialisée. Seules les propriétés en lecture/écriture sont sérialisées.

    Autres remarques :

    - Comme l'a dit olibara, évite d'utiliser une ArrayList pour stocker des données typées : la classe générique List<T> est beaucoup plus adaptée.

    - Ta classe contactCollection ne sert pas à grand chose, tu pourrais directement utiliser une List<contact>. Par contre, par défaut l'élément racine sera "<ArrayOfcontact>" et non pas "<contactCollection>" ; pour y remédier, tu peux utiliser le constructeur de XmlSerializer qui prend en paramètre un XmlRootAttribute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlSerializer xs = new XmlSerializer(typeof(List<contact>), new XmlRootAttribute("contactCollection"));
    - L'attribut Serializable ne sert à rien pour la sérialisation XML, c'est juste pour la sérialisation avec BinaryFormatter

    - Evite de déclarer des champs publics dans tes classes, crée plutôt des propriétés. C'est particulièrement important si la classe fait partie d'une librairie utilisée par d'autre programmes : par exemple, si un jour tu veux implémenter une notification de changement quand un champ est modifié, tu seras obligé de changer ce champ en propriété, et les programmes qui utilisent la classe ne fonctionneront plus car l'interface de la classe aura changé. Si tu n'exposes que des propriétés, le problème ne se pose plus, car tu peux changer l'implémentation privée sans modifier l'interface publique


    Pour plus d'infos sur la sérialisation XML, tu peux regarder ces tutos :
    http://tlevesque.developpez.com/dotn...serialization/
    http://tlevesque.developpez.com/dotn...rialization-2/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour tout le monde,

    Merci beaucoup tomlev et olibara pour votre aide très précieuse. Grâce à tout vos conseils j'ai réussi à m'en sortir pour la sérialisation! Je pense que je devrais donc m'en sortir dans le sens inverse

    Sinon pour les champs publiques je ne savais pas, merci de l'avoir souligner, je vais modifier mon code en conséquence

    En tout cas merci beaucoup à vous deux, mon problème est résolu, je laisse toutefois la discussion ouverte si jamais j'ai un soucis dans le sens xml -> objet

  6. #6
    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
    Je pense que je devrais donc m'en sortir dans le sens inverse
    Salut

    Dans le bout de code exemple tu a la methode LoadXml() qui fait l'inverse
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/12/2009, 11h27
  2. Serialization d'une classe
    Par olibara dans le forum C#
    Réponses: 8
    Dernier message: 02/02/2009, 18h11
  3. Réponses: 0
    Dernier message: 29/10/2007, 15h28
  4. Serialization d'une classe avec arraylist
    Par jpsegret dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 01/04/2007, 10h46
  5. Réponses: 8
    Dernier message: 10/07/2005, 00h10

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