Pocas clases se me han hecho tan necesarias últimamente como ha sido un serializador en Xml.
La tecnología ya es multiplataforma y para la buena comunicación entre sistemas hacen falta protocolos estándares.
Xml y Json son buenos ejemplos de estándard de comunicación, pero el serializador de Javascript de C#.net no requiere ninguna especificación del tipo original para serializar o deserializar, por lo que no merece la pena crear una entrada en el blog para ello.
El algoritmo es sencillo, pero escribir siempre las mismas 5 líneas de código, cambiando solo el tipo de objeto es pesado:
using System.IO;
using System.Text;
using System.Xml.Serialization;
...
public static class Xml<T> where T : class
{
public static string Serialize(T item)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
StringBuilder stringBuilder = new StringBuilder();
TextWriter textWriter = new StringWriter(stringBuilder);
xmlSerializer.Serialize(textWriter, item);
return stringBuilder.ToString();
}
public static T Deserialize(string xml)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
TextReader textReader = new StringReader(xml);
return (T)xmlSerializer.Deserialize(textReader);
}
}
La implementación pasa a ser tan sencilla como una sola línea de código:
MyObject o;
...
string s = Xml<MyObject>.Serialize(o);
MyObject r = Xml<MyObject>.Deserialize(s);
return (o != r) && (o.Equals(r)); //it returns true, cause 'o' and 'r' are not the same instance, but they have the same values