<p>Voici une version fonctionnelle. J’ai changé les labels <code>XmlElementAttribute</code> en <code>XmlElement</code> car dans le XML, les valeurs StockNumber, Make et Model sont des éléments, pas des attributs. J’ai également supprimé le <code>reader.ReadToEnd();</code> (cette <a href="http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx">fonction</a> lit le flux entier et renvoie une chaîne, donc la fonction <code>Deserialize()</code> ne pouvait plus utiliser le lecteur… la position était à la fin du flux). J’ai aussi pris quelques libertés avec le nommage 🙂.</p>
<p>Voici les classes :</p>
<pre><code class="lang-auto">[Serializable()]
public class Car
{
[System.Xml.Serialization.XmlElement("StockNumber")]
public string StockNumber { get; set; }
[System.Xml.Serialization.XmlElement("Make")]
public string Make { get; set; }
[System.Xml.Serialization.XmlElement("Model")]
public string Model { get; set; }
}
[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
[XmlArray("Cars")]
[XmlArrayItem("Car", typeof(Car))]
public Car[] Car { get; set; }
}
</code></pre>
<p>La fonction de désérialisation :</p>
<pre><code class="lang-auto">CarCollection cars = null;
string path = "cars.xml";
XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();
</code></pre>
<p>Et le XML légèrement modifié (j’ai dû ajouter un nouvel élément pour envelopper … .NET est pointilleux sur la désérialisation des tableaux) :</p>
<pre><code class="lang-auto"><?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
<Car>
<StockNumber>1020</StockNumber>
<Make>Nissan</Make>
<Model>Sentra</Model>
</Car>
<Car>
<StockNumber>1010</StockNumber>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<StockNumber>1111</StockNumber>
<Make>Honda</Make>
<Model>Accord</Model>
</Car>
</Cars>
</CarCollection>
</code></pre>