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:
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:
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:
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:
1 2 3 4 5 6
|
XmlSerializer serializer = new XmlSerializer(typeof(A));
using (TextReader file = new StreamReader(fileName))
{
a = (A)serializer.Deserialize(file);
} |
Merci.