Serializar y Deserializar .Net

Serializar a xml y Deserializar a objetos es una acción muy útil en programación, pero lo que es muy útil, es tener un código que te permita realizar esta acción en todos tus objetos de .Net. La aplicación de este tipo de utilidades es muy útil para la comunicación cliente-servidor, guardar datos en disco de una manera estructura, o visualización de datos en estilo xml.

Aquí el código:

SERIALIZACIÓN

public static string Serialize(object pBenefit)

{

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(pBenefit.GetType());

System.Text.StringBuilder sb = new System.Text.StringBuilder();

System.IO.StringWriter writer = new System.IO.StringWriter(sb);
ser.Serialize(writer, pBenefit);
return sb.ToString();
}

DESERIALIZACIÓN

public static object Deserialize(string lXml, Type lType)
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

doc.LoadXml(lXml);

System.Xml.XmlNodeReader reader = new System.Xml.XmlNodeReader(doc.DocumentElement);

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(lType);

object obj = ser.Deserialize(reader);

return obj;

}

5 comentarios en “Serializar y Deserializar .Net”

  1. De todos los objetos que permitan serialización. Tengo entendido que hay que cumplir varias restricciones para que el estado del objeto se pueda restaurar.

    Por ejemplo, con la siguiente clase no funciona

    public class Casa
    {
    private string elColor;

    public Casa() : this(“roja”) { }

    public Casa(string unColor)
    {
    this.elColor = unColor;
    Console.WriteLine(
    String.Format(
    “Soy una casa {0}”,
    this.elColor));
    }

    public void Pintar(string unColor)
    {
    Console.WriteLine(
    String.Format(
    “Antes era {0} y ahora soy {1}”,
    this.elColor, unColor));
    this.elColor = unColor;
    }
    }

  2. @Javi López
    La serialización por Xml (que es la que Marcos muestra en el post), serializa sólamente sólamente las propiedades o miembros públicos del objeto.
    Además la clase debe cumplir otra restricción que es la de tener un constructor sin parámetros (para que el XmlSerializer pueda instanciar un objeto y rellenarlo cuando deserializa).

    En tu ejemplo si que tienes el constructor sin parámetros, pero no tienes estado publico, por lo que la clase se serializaría, pero se perdería el color asociado (todas las casas serían rojas).

    Un saludo!

  3. Eso es a lo que iba… que solo funciona en casos muy concretos, porque un clase que tenga todos los datos que componen su estado públicos, y supongo que de lectura y escritura no creo que sea un caso de lo más normal, a no ser que lo diseñes sólo pensando en la serialización.

  4. @Javi
    Cada cosa sirve para lo que sirve… 🙂
    La serialización en Xml usando XmlSerializer no está pensada para objetos distribuídos (para eso hay otras tecnologías) sinó para “guardar datos” de una forma fácil usando Xml… Y sí, tienes razón, muchas veces estas clases las diseñas con la serialización en mente, ya que generalmente las decoras con atributos (tipo [XmlElement] y similares) para adaptar la clase al esquema del xml que deseas (de)serializar.
    Para leer/escribir ficheros de configuración o consumir Xmls externos es realmente útil.

    Un abrazo!

  5. Lamentablemente .NET no serializa objetos que tengan referencias cruzadas o circulares, se debe agregar “Ingore” en tales casos, no me ha sido muy util dada la complejidad que tienen los objetos con los que trabajo, obligandome a repensar sobre el codigo que estoy utilizando.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *