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


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 742
    Points : 5 432
    Points
    5 432
    Par défaut Sérialisation et héritage
    Bonjour,

    J'ai un Objet A qui contient des Objet B, C et D.
    B, C et D ont besoin de certaines informations de A.

    Pour ce faire, j'ai créé une classe O contenant ces informations communes, fait hériter de O les classes A, B, C et D et mis dans A une procédure pour passer les informations lors de l'affectation des propriétés pointant vers B, C et D.
    Code C# : 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
    using System;
     
    namespace Test
    {
        public class O
        {
            public String Info1 { get; set; }
            public String Info2 { get; set; }
            public String Info3 { get; set; }
        }
     
        public class A : O
        {
            public String InfoA1 { get; set; }
            public String InfoA2 { get; set; }
            public String InfoA3 { get; set; }
            public String InfoA4 { get; set; }
            public String InfoA5 { get; set; }
     
            B b = null;
            C c = null;
            D d = null;
     
            public B B
            {
                get { return b; }
                set
                {
                    b = value;
                    Fill(value);
                }
            }
     
            public C C
            {
                get { return c; }
                set
                {
                    c = value;
                    Fill(value);
                }
            }
     
            public D D
            {
                get { return d; }
                set
                {
                    d = value;
                    Fill(value);
                }
            }
     
            void Fill(O o)
            {
                o.Info1 = Info1;
                o.Info2 = Info2;
                o.Info3 = Info3;
            }
        }
     
        public class B : O
        {
            public String InfoB1 { get; set; }
            public String InfoB2 { get; set; }
        }
     
        public class C : O
        {
            public String InfoC1 { get; set; }
        }
     
        public class D : O
        {
            public String InfoD1 { get; set; }
        }
     
    }

    Logiquement le résultat de la sérialisation est le suivant :
    Code XML : 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
    <?xml version="1.0"?>
    <A xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Info1>1</Info1>
      <Info2>2</Info2>
      <Info3>3</Info3>
      <InfoA1>A1</InfoA1>
      <InfoA2>A2</InfoA2>
      <InfoA3>A3</InfoA3>
      <InfoA4>A4</InfoA4>
      <InfoA5>A5</InfoA5>
      <B>
        <Info1>1</Info1>
        <Info2>2</Info2>
        <Info3>3</Info3>
        <InfoB1>B1</InfoB1>
        <InfoB2>B2</InfoB2>
      </B>
      <C>
        <Info1>1</Info1>
        <Info2>2</Info2>
        <Info3>3</Info3>
        <InfoC1>C1</InfoC1>
      </C>
      <D>
        <Info1>1</Info1>
        <Info2>2</Info2>
        <Info3>3</Info3>
        <InfoD1>D1</InfoD1>
      </D>
    </A>

    Mon but est d'éviter de répéter les informations communes dans les nœuds B, C et D.
    Je souhaite les avoirs dans le nœud A uniquement laisser la méthode Fill faire son travail pour remplir B, C et D lors de la déserialisation.

    J'ai essayé de créer une classe O2 héritant de O et d'y mettre un attribut XmlIgnore pour ensuite faire hériter B, C et D de O2 mais XmlIgnore n'est valide que sur une propriété.
    A moins que O2 répète toute les propriété et n'hérite pas de O, quelle autre possibilité s'offre à moi ?

    Si ça peut aider voici le code utiliser pour sérialiser et déserialiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                XmlSerializer serializer = new XmlSerializer(typeof(A));
                using (Stream file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                {
                    serializer.Serialize(file, a);
                }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                XmlSerializer serializer = new XmlSerializer(typeof(A));
                using (TextReader file = new StreamReader(fileName))
                {
                    a = (A)serializer.Deserialize(file);
                }
    Merci.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    Tu peux essayer avec en implémentant IXmlSerializable dans les classe B,C,D et, si c'est une propriété héritée, alors ne pas la sérialiser

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 742
    Points : 5 432
    Points
    5 432
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Tu peux essayer avec en implémentant IXmlSerializable dans les classe B,C,D et, si c'est une propriété héritée, alors ne pas la sérialiser
    Cela signifie répéter autant de fois le même code que j'ai de classes héritant de O.
    Les noms ne sont évidemment pas ceux utilisés mais il est déjà prévu d'avoir deux autre classes E et F héritant également de O.
    Et j'en aurais potentiellement d'autres dans plusieurs mois.

    Pour le moment j'ai pris l'option de ne pas faire hériter la classe A de O et de rajouter les infos communes directement dans A.
    Je marque donc le sujet résolu mais je reste à bien entendu à l'affut d'autres propositions.

    Pour info, l'option retenue pour le moment donne ce code :
    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
    namespace Test
    {
        public class O
        {
            [XmlIgnore]
            public String Info1 { get; set; }
            [XmlIgnore]
            public String Info2 { get; set; }
            [XmlIgnore]
            public String Info3 { get; set; }
        }
     
     
        public class A
        {
            public String Info1 { get; set; }
            public String Info2 { get; set; }
            public String Info3 { get; set; }
     
            public String InfoA1 { get; set; }
            public String InfoA2 { get; set; }
            public String InfoA3 { get; set; }
            public String InfoA4 { get; set; }
            public String InfoA5 { get; set; }
     
            B b = null;
            C c = null;
            D d = null;
     
            public B B
            {
                get { return b; }
                set
                {
                    b = value;
                    Fill(value);
                }
            }
     
            public C C
            {
                get { return c; }
                set
                {
                    c = value;
                    Fill(value);
                }
            }
     
            public D D
            {
                get { return d; }
                set
                {
                    d = value;
                    Fill(value);
                }
            }
     
            void Fill(O o)
            {
                o.Info1 = Info1;
                o.Info2 = Info2;
                o.Info3 = Info3;
            }
        }
     
        public class B : O
        {
            public String InfoB1 { get; set; }
            public String InfoB2 { get; set; }
        }
     
        public class C : O
        {
            public String InfoC1 { get; set; }
        }
     
        public class D : O
        {
            public String InfoD1 { get; set; }
        }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2013, 15h26
  2. [XStream] [dé]sérialisation et héritage et références
    Par captain_mich dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 21/10/2011, 11h44
  3. Boost, héritage et sérialisation
    Par AF_2.8 dans le forum Boost
    Réponses: 3
    Dernier message: 19/11/2010, 09h42
  4. Sérialisation + Héritage
    Par kirua_sama dans le forum C#
    Réponses: 0
    Dernier message: 12/08/2010, 12h06
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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