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#

  1. #1
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Points : 194
    Points
    194
    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 expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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
    Points : 1 454
    Points
    1 454
    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 habitué
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Points : 194
    Points
    194
    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 expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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
    Points : 1 454
    Points
    1 454
    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 habitué
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Points : 194
    Points
    194
    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 habitué
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Points : 194
    Points
    194
    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 .

  7. #7
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Bien alors mais si tu utilise la fonction de sérialisation générique ça sera mieux pour toi

  8. #8
    Membre habitué
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Points : 194
    Points
    194
    Par défaut
    j'utilise la fonction de serialization générique justement,

    le problème vient du fait qu'utilisant l'héritage sans ce code, lors de la serialization j'ai une erreur m'indiquand que News est inconnu comme type.

  9. #9
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    ok ce bien alors

+ 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