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.