Bonjour,
je suis en train de me casser les dents sur un problème étrange, concernant une déserialisation avec XmlSerializer.
Mon but est de déserialiser une propriété de type List<T>. La sérialisation fonctionne parfaitement.
Si le getter de la propriété est du genre "return maList", pas de problème. Si je fais un getter un peu différent, la déserialisation ne fonctionne plus.
Pour reproduire le problème, voilà du code simplissime :
1) D'abord, une classe de base toute bête
2) Le container d'une liste privée d'instances Foo, avec une propriété publique pour y accéder avec xmlSerializer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class Foo { public String name; public Foo() { } public Foo(String nameOfThis) { name = nameOfThis; } }
Et enfin le code d'execution.
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 [XmlRoot("Bar")] public class Bar { private List<Foo> list = new List<Foo>(); public Bar() { } public void Add(String n) { list.Add(new Foo(n)); } public List<Foo> l { get { //List<Foo> lTemp = new List<Foo>(); //foreach (Foo f in list) //{ // if (f.name != "2nd") // lTemp.Add(f); //} //return lTemp; return list; } set { list = value; } } }
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 class Program { static void Main(string[] args) { Bar b = new Bar(); b.Add("1er"); b.Add("2nd"); b.Add("3eme"); XmlSerializer serializer = new XmlSerializer(typeof(Bar)); StreamWriter myWriter = new StreamWriter("testSerialisation.xml"); serializer.Serialize(myWriter, b); myWriter.Close(); Bar myObject; XmlSerializer mySerializer = new XmlSerializer(typeof(Bar)); FileStream myFileStream = new FileStream("testSerialisation.xml", FileMode.Open); myObject = (Bar)mySerializer.Deserialize(myFileStream); System.Diagnostics.Debug.Assert(myObject.l.Count == b.l.Count); } }
Donc comme vous pouvez le constater, ce code enregistre simplement la liste et la restaure. CE CODE FONCTIONNE, la déserialisation ne pose pas de problème.
Maintenant, dans le getter, décommentez les lignes et commentez la dernière. Relancez. La sérialisation fonctionne, mais pas la déserialisation. list est vide !!!!
Pourtant les fichiers de sorties sont similaires. Il semblerait que lorsqu'un getter n'est pas trivial, la déserialisation échoue...
Est-ce que j'ai oublié quelque chose dans la manipulation du xmlSerializer ? ou alors est-ce un bug bizarre ???
Partager