J'entends régulièrement dire -- à tort -- que la sérialisation XML avec Silverlight 2 Beta 1 n'est pas possible, c'est pourquoi j'ai voulu faire ce petit article :)
Pour sérialiser vos objets en XML il suffit d'ajouter dans les références de votre projet l'assembly "System.Xml.Serialization":
Ensuite déclarez par exemple votre classe à serialiser de la manière suivante:
public class Test
{
[XmlAttribute]
public string Id { get; set; }
public int Count { get; set; }
public string Name { get; set; }
}
Seules contraintes: votre classe doit avoir au moins un constructeur par défaut (ou pas de constructeur du tout) et les propriétés à sérialiser doivent être accessibles en lecture/écriture (ces contraintes n'ont rien à voir avec Silverlight). Libre à vous d'utiliser tout l'armada de sérialisation XML classique (XmlAttribute, XmlIgnore, XmlRoot, etc.). Imaginons ensuite par exemple le code suivant:
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
var test = new Test { Id = "titi", Name = "toto", Count = 42 };
string xml = Tools.XmlSerialize<Test>(test);
Console.WriteLine(xml);
}
}
Si on déclare la fameuse méthode de sérialisation de cette manière...
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Alti
{
public static class Tools
{
public static string XmlSerialize<T>(T obj)
{
var s = new XmlSerializer(typeof(T));
var stream = new MemoryStream();
s.Serialize(stream, obj);
stream.Position = 0;
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
var utf8 = new UTF8Encoding();
return utf8.GetString(buffer, 0, buffer.Length);
}
}
}
...et qu'on prend la peine de lancer l'application, la magie opère :
<?xml version="1.0" encoding="utf-8" ?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" Id="titi">
<Count>42</Count>
<Name>toto</Name>
</Test>
[EDIT] Si les namespaces vous irritent (comme moi), faites plutot:
var ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty);
s.Serialize(stream, obj, ns);
ce qui donne:
<?xml version="1.0" encoding="utf-8" ?>
<Test Id="titi">
<Count>42</Count>
<Name>toto</Name>
</Test>
Hope this helps !
Aurélien