jeudi 22 mai 2008
Silverlight 2 et la sérialisation XML
Par Aurélien RAMONDOU, jeudi 22 mai 2008 à 00:02 :: .Net
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
