Datapayasadas

abril 1, 2010

Serializando y deserializando objetos

Filed under: .Net, C#, Serialización — Etiquetas: — Matías @ 11:03 am

Todos hemos escuchado hablar alguna vez la palabra serialización, pero posiblemente nunca nos hemos preocupado lo suficiente como para saber que es, en que consiste y cual es su utilidad.

Generalmente cuando empezamos a programar aplicaciones que deben interactuar remotamente con otras (o con ella misma) es ahí cuando deberemos invertir unos minutos en comprender este concepto, muy importante por cierto y de extrema utilidad.

Veamos que dice la Wikipedia sobre serialización:

En ciencias de la computación, la serialización (o marshalling en inglés) consiste en un proceso de codificación de un Objeto (programación orientada a objetos) en un medio de almacenamiento (como puede ser un archivo, o un buffer de memoria) con el fin de transmitirlo a través de una conexión en red como una serie de bytes o en un formato humanamente más legible como XML o JSON, entre otros. La serie de bytes o el formato pueden ser usados para crear un nuevo objeto que es idéntico en todo al original, incluido su estado interno (por tanto, el nuevo objeto es un clon del original). La serialización es un mecanismo ampliamente usado para transportar objetos a través de una red, para hacer persistente un objeto en un archivo o base de datos, o para distribuir objetos idénticos a varias aplicaciones o localizaciones.

Bien, entonces es básicamente un mecanismo que nos permite representar un objeto como un arreglo de bytes. Por simple deducción, la deserialización es el proceso inverso, convertir un arreglo de bytes en un objeto.

¿Cuales son las ventajas del proceso de serialización?

Los datos serializados son fáciles de representar, transportar y almacenar. En .Net tenemos el tipo de datos byte, así como también podemos crear arreglos de ellos: byte[]. La mayoría, si no todos, los métodos para transmisión y recepción de datos tanto en Sockets como clases que simplifican un poco el trabajo (TcpClient) en red, envían y reciben arreglos de bytes. Podemos decir lo mismo con los métodos de almacenamiento de datos, el manejo de bytes es la forma más directa.

Para entender un poco más lo que hemos dicho hasta ahora, veamos un ejemplo:

public static byte[] Serialize(object objToSerialize)
{
    using (MemoryStream memStream = new MemoryStream())
    {
        BinaryFormatter binFormatter = new BinaryFormatter();
        binFormatter.Serialize(memStream, objToSerialize);

        return memStream.ToArray();
    }
}

¿Se nota? Es realmente fácil serializar objetos en .Net.
Para realizar el camino inverso, es decir, deserializar un objeto:

public static object Deserialize(byte[] objToDeserialize)
{
    using (MemoryStream memStream = new MemoryStream(objToDeserialize))
    {
        BinaryFormatter binFormatter = new BinaryFormatter();
        memStream.Position = 0;

        return binFormatter.Deserialize(memStream);
    }
}

Casi me olvido, para poder serializar una clase debemos marcarla con el atributo [Serializable], el cual no se puede heredar.

Más adelante veremos como enviar y recibir objetos serializados sobre internet (o una LAN).

Anuncios

1 comentario »

  1. […] hoy voy a contarles un poco sobre el protocolo UDP y luego mostraré un ejemplo para aprovechar la serialización de objetos de la que les hablé hace unos […]

    Pingback por Atacando dos frentes: Serialización de objetos y transporte sobre UDP « Datapayasadas — abril 9, 2010 @ 10:15 pm


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: