21 de febrero de 2010

Serializar y Deserializar con C# 3

C# Serializar / Deserializar un objeto: Veamos un ejemplo práctico y sencillo de como serializar un objeto a un documento XML.

Desde hace bastante tiempo la serialización y deserialización de objetos es algo bastante común en mis proyectos. Pero la novedad de este pequeño post de hoy es que implementaremos ambas acciones haciendo uso de los métodos extensores.

No pretendo explicar aquí que es la serialización o deserialización, asumo que el lector ya conoce este concepto, en caso contrario visita este enlace.

Primero pongamos en contexto de lo que queremos lograr. Imaginemos que tenemos un objeto de Tipo Contacto que queremos serializar en un XML (normalmente se usa para enviarlo a un web services o por cualquier otra razón…) y que posteriormente por alguna otra razón necesitáramos deserializarlo (convertir nuevamente el XML en un objeto de tipo contacto) ver código:

//Creo el objContacto de tipo Contacto
Contacto objContacto =
    new Contacto { IdContacto = 1, Nombre = "Pedro", Telefono = "601010101" };
 
//Serializar objContacto a XML
string xmlContacto = objContacto.SerializarToXml();
 
//Deserializar XML a objContacto
Contacto contactoDeserializado = xmlContacto.DeserializarTo<Contacto>();

Según podemos apreciar en el código expuesto la serialización la logramos usando el método extensor SerializarToXml el cual definiremos mas abajo.

Y para la deserialización empleamos el método DeserializarTo<T>. Pero no me enredo más, pasemos a ver el código de creación de ambos métodos extensores:

//Serializar a XML (UTF-16) un objeto cualquiera
public static string SerializarToXml(this object obj)
{
  try
  {
    StringWriter strWriter = new StringWriter();
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
 
    serializer.Serialize(strWriter, obj);
    string resultXml = strWriter.ToString();
    strWriter.Close();
 
    return resultXml;
  }
  catch
  {
      return string.Empty;
  }
}
 
//Deserializar un XML a un objeto T
public static T DeserializarTo<T>(this string xmlSerializado)
{
  try
  {
    XmlSerializer xmlSerz = new XmlSerializer(typeof(T));
 
    using (StringReader strReader = new StringReader(xmlSerializado))
    {
        object obj = xmlSerz.Deserialize(strReader);
        return (T)obj;
    }
  }
  catch { return default(T); }
}

Y hasta aquí el post…

Nota: Este método de serialización nos devuelve el XML con Encoding.UTF16

 

Artículos Relacionados: