2009-09-21 5 views
0

J'ai utilisé XmlSerializer pendant de nombreuses années sans aucun problème. J'ai commencé un nouveau projet et la classe j'ai fait une liste étendue. Quand je suis allé sérialiser les données, j'ai perdu les propriétés que j'avais ajoutées à ma classe. Évidemment, je peux corriger cela en changeant autour de ma classe afin qu'elle ne longe plus List. Je me demandais vraiment pourquoi XmlSerializer ignore les propriétés de la liste.XmlSerializer n'agit pas comme je le pense

var data = new Data { Number = 3 }; 
data.AddRange(Enumerable.Range(5, 5)); 
var serializer = new XmlSerializer(typeof(Data)); 
var memoryStream = new MemoryStream(); 
serializer.Serialize(memoryStream, data); 
memoryStream.Position = 0; 
var dataSerialized = new StreamReader(memoryStream).ReadToEnd(); 

public class Data : List<int> 
{ 
    public int Number 
    { 
     get; 
     set; 
    } 
} 

Après l'extrait de code ci-dessus dataSerialized ressemble à ceci (son manque la propriété « Nombre »):

<?xml version="1.0"?> 
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <int>5</int> 
    <int>6</int> 
    <int>7</int> 
    <int>8</int> 
    <int>9</int> 
</ArrayOfInt> 

Répondre

6

C'est par la conception, au fond de la décision a été prise pour gérer les collections sous forme de tableaux non comme classes avec des membres, de sorte que les collections ressemblent à des tableaux sur le réseau, donc ils n'ont aucun membre autre que les éléments de collection, et peuvent être "aplatis" en ajoutant le [XmlElement] au membre du type ICollection. Ce que vous pouvez faire est implémenter IXmlSerializable et faire la sérialisation personnalisée, cependant personnellement je préfère la manière de DataContract.

+0

Réponse très claire –

1

Voir la réponse acceptée to one of my own questions (Ignorer la question elle-même car le point manque complètement). XmlSerializer ne sérialisera que la collection Items d'une collection, jamais ses propriétés.

Questions connexes