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 :

Sérialisation d'objet hérité


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut Sérialisation d'objet hérité
    Bonjour,
    J'ai un objet hérité d'un List<>. Dans cet objet, j'ajoute une propriété. Lors d'une sérialisation xml, ma propriété n'apparait pas dans le fichier xml.
    Est-ce que c'est normal ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [Serializable]
      public class TListeFields : List<TField>
      {
        private DateTime fLastSavedDate;
     
        [XmlElement(ElementName="date")]
        public DateTime LastSavedDate { get { return fLastSavedDate; } set { fLastSavedDate = value; } }
     
        public TListeFields()
        {
     
        }
    }
    Par contre, tous les objets contenus dans la liste sont correctement sérialisés.

  2. #2
    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 : 43
    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
    Par défaut
    Les classes qui implémentent ICollection sont sérialisées de façon particulière : seuls les éléments de la collection sont sérialisés.
    Il faudrait donc que tu personnalises ta sérialisation en implémentant IXmlSerializable

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Ok Merci Tomlev...
    J'ai testé, mais l'implémentation des fonction ReadXml et WriteXml du IXmlSerializable annihile celle du TList. C'est à dire que je n'ai plus que ma propriété dans mon xml.....

  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 : 43
    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
    Par défaut
    Citation Envoyé par ppphil Voir le message
    l'implémentation des fonction ReadXml et WriteXml du IXmlSerializable annihile celle du TList.
    Ben il faut que tu sérialises la liste dans ton WriteXML, et que tu la relises dans ReadXml

  5. #5
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Oui, d'accord. Mais comment tu peux sérialiser cette liste sans tomber dans une récursivité infinie ? (ce qui m'arrive). Je dois dire que j'ai de la peine à comprendre comment implémenter ces interfaces...

  6. #6
    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 : 43
    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
    Par défaut
    Citation Envoyé par ppphil Voir le message
    Oui, d'accord. Mais comment tu peux sérialiser cette liste sans tomber dans une récursivité infinie ? (ce qui m'arrive). Je dois dire que j'ai de la peine à comprendre comment implémenter ces interfaces...
    Voilà une façon de faire (avec une List<string> à laquelle j'ai ajouté une propriété Nom) :
    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
     
            #region IXmlSerializable Members
     
            public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }
     
            public void ReadXml(System.Xml.XmlReader reader)
            {
                while (reader.Read())
                {
                    if (reader.NodeType == System.Xml.XmlNodeType.Element)
                    {
                        if (reader.Name == "Nom")
                        {
                            reader.Read();
                            this.Nom = reader.Value;
                        }
                        else if (reader.Name == "Liste")
                        {
                            XmlAttributeOverrides ovr = new XmlAttributeOverrides();
                            XmlAttributes attr = new XmlAttributes();
                            attr.XmlRoot = new XmlRootAttribute("Liste");
                            ovr.Add(typeof(List<string>), attr);
                            XmlSerializer xs = new XmlSerializer(typeof(List<string>), ovr);
                            List<string> list = xs.Deserialize(reader) as List<string>;
                            this.AddRange(list);
                        }
                    }
                }
            }
     
            public void WriteXml(System.Xml.XmlWriter writer)
            {
                XmlSerializer xs = new XmlSerializer(typeof(string));
                writer.WriteStartElement("Nom");
                writer.WriteValue(this.Nom);
                writer.WriteEndElement();
     
                XmlAttributeOverrides ovr = new XmlAttributeOverrides();
                XmlAttributes attr = new XmlAttributes();
                attr.XmlRoot = new XmlRootAttribute("Liste");
                ovr.Add(typeof(List<string>), attr);
                xs = new XmlSerializer(typeof(List<string>), ovr);
                xs.Serialize(writer, this);
            }
     
            #endregion
    Il n'y a pas de récursivité infinie sur le xs.Serialize(writer, this), parce que le XmlSerializer est créé pour le type List<string> et non TListeFields.

    Je te laisse adapter ça à ton cas...

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

Discussions similaires

  1. Sérialiser un objet hérité dans webservice
    Par Rome dans le forum Services Web
    Réponses: 1
    Dernier message: 19/07/2010, 09h33
  2. [POO] Sérialisation d'objet en PHP
    Par Invité(e) dans le forum Langage
    Réponses: 4
    Dernier message: 29/08/2006, 15h37
  3. Sérialisation d'objets en c++
    Par OxyLin dans le forum C++
    Réponses: 9
    Dernier message: 13/02/2006, 22h50
  4. [C#] Comment sérialiser un objet Font ?
    Par djmanu dans le forum C#
    Réponses: 5
    Dernier message: 20/01/2006, 09h51
  5. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28

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