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 XML et héritage


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut Serialisation XML et héritage
    Bonjour,

    Je rencontre un problème avec la serialisation d'objet enfant.
    En gros, j'ai plusieurs classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public abstract class Base
     
    Public abstract class BaseDocument : List<Base>
     
    public class News : Base
     
    public class NewsDocument : List<News>

    Lorsque j'essaie de Serialiser newsDocument j'obtient une erreur indiquant que News est inconnu.
    J'ai réussi a contourné le problème en reférenssant directment dans Base le type News seulement Base est voué a aller dans une assembly différente et il est donc hors de question de devoir référencer les class fille dans la class "mère".
    Je n'arrive pas à le faire via les attributes Overrides, je pense m'y être mal pris :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                XmlAttributeOverrides aor = new XmlAttributeOverrides();
                XmlAttributes attrs = new XmlAttributes();
                attrs.XmlElements.Add(new XmlElementAttribute("news", typeof(News)));
                aor.Add(typeof(NewsDocument),"NewsDocument",attrs);
                XmlSerializer xser = new XmlSerializer(typeof(NewsDocument),aor );
                xser.Serialize(txtw, this);
    Quelqu'un voit d'où vient mon erreur ?

  2. #2
    Membre très actif
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Billets dans le blog
    9
    Par défaut
    Tu fait pas l'héritage de d'une liste de news
    tu peux faire comme la suit :

    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
    public static void Serialise<T>(string path, T dataToSerialize)
            {
                using (Stream stream = File.Open(path, FileMode.Create, FileAccess.ReadWrite))
                {
                    var serializer = new XmlSerializer(typeof(T));
                    var writer = new XmlTextWriter(stream, Encoding.Default);
                    writer.Formatting = Formatting.Indented;
                    var ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    serializer.Serialize(writer, dataToSerialize, ns);
                    writer.Close();
                }
            }
     
            public static T Deserialize<T>(string filePath)
            {
                var itemObject = new object();
                if (File.Exists(filePath))
                {
                    var serializer = new XmlSerializer(typeof(T));
                    TextReader reader = new StreamReader(filePath);
                    itemObject = (T)serializer.Deserialize(reader);
                    reader.Close();
                }
                return (T)itemObject;
            }
    Exemple Ton classe à sérialisé

    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
     
     [XmlRoot("users")]
        public class Users
        {
            [XmlElement("user")] 
            public List<User> ListUser { get; set; }
     
            [XmlAttribute("channel")]
            public string Url { get; set; }
     
            [XmlIgnore]
            public int IdSite { get; set; }
     
        }
     
        public class User
        {
            [XmlElement("user")] 
            public string Name{ get; set; }
     
            [XmlAttribute("channel")]
            public string Age{ get; set; }
     
            [XmlIgnore]
            public int IdUser { get; set; }
     
        }

    Enjoy

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    Merci pour la réponse, seulement j'ai besoin de cet Héritage, je n'ai pas exposer ici l'ensemble du code, mais chaque classe de base à des méthodes et des propriétés supplémentaires.

    Dans le code que tu me proposes tu m'indiques de retirer l'héritage, mais je perd tout l'avantage de l'héritage .

    EDIT : après relecture ..

    si j'ai bien compris, tu me proposes de transformer mes classe comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public abstract class BaseDocument
    {
         Public List<Base> MaListe
     
    ... 
    }
    mais du coup pour Newsdocument ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public abstract class NewsDocument : BaseDocument
    {
        public new List<News> MaListe
    }
    ou est ce supperflu ?

  4. #4
    Membre très actif
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Billets dans le blog
    9
    Par défaut
    Il faut rajouter le geter et le seter dans ce cas tu laisse pas la Liste comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public new List<News> MaListe
    il faut la faire comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public new List<News> MaListe{get; set;}
    et si c'est pas le cas tu rajoute le XMLIngior

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    J'ai donc essayé en ajoutans a modifiant ma Classe BaseDocument comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    public abstract class BaseDocumnet
    {
        public List<Base> MaListe { get; set; }
     
    }
    Je remplis la liste depuis la class enfant NewsDocument

    Mais j'ai toujours la même erreur au moment de la serialization .

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    je m'auto répond car j'ai trouvé la solution (enfin avec l'aide fournit ici )


    Une fois les classes modifiées j'ai egalement changer le code de serialisation comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                attrs.XmlElements.Add(new XmlElementAttribute("news", typeof(News))); // on ajoute l'attribut News
                attrOverrides.Add(typeof(BaseDocument), "MaListe", attrs); // on indique que "MaListe" , attribut de BaseDocument est a overrider avec l'element au dessus.
                XmlSerializer xser = new XmlSerializer(typeof(NewsDocument),attrOverrides ); // on charge l'override.
                xser.Serialize(txtw, this);
    Merci pour l'aide .

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

Discussions similaires

  1. Serialisation XML, Héritage, Enumération
    Par ßories dans le forum C#
    Réponses: 6
    Dernier message: 10/12/2010, 17h47
  2. Serialisation XML avec Xstream !
    Par fabred dans le forum Persistance des données
    Réponses: 4
    Dernier message: 06/06/2007, 08h56
  3. [DOM] [Package] serialisation XML
    Par Overflow64 dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/10/2004, 16h43
  4. [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
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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