You are on page 1of 13

Serializacin Entendiendo la Serializacin Serializacin y .

NET El Mecanismo por Defecto Formatters BinaryFormatter Deserializar el Objeto XmlFormatter Atributos no Serializables Objetos No Serializables Serializacin Personalizada Consideraciones de Desempeo

Serializacin
La serializacin es un tema muy utilizado pero muy desconocido por todos los desarrolladores de software en general. Y digo muy utilizado porque esta presente en cas todos los eventos de programacin en los cuales trabajamos, por ejemplo copy & paste, servicios web, objeto sesin de ASP.NET, etc. En este captulo vamos a trabajar con la serializacin en .NET ya que este tema tambin existe en lenguajes como C++ y Java.

Entendiendo la Serializacin
En los ejercicios anteriores hemos estado utilizando lo que se conoce como objetos voltiles ya que creamos las instancias de los objetos cuando se inicia la ejecucin del programa y estas mueren cuando el scope del mtodo en el que fueron creados termina, siendo la finalizacin del programa que estamos ejecutando el ltimo paso antes de que estos objetos desaparezcan de la memoria. Ahora, pensemos como funcionan los servicios Web. Una persona invoca un servicio desde el cliente o consumidor del servicio y este le devuelve una estructura - objeto que puede ser ledo desde el lado del cliente. En realidad lo que hace el server es tomar un objeto que est en la memoria del servidor, encapsularlo de alguna forma y enviarlo al cliente para que este lo pueda recrear en su memoria y pueda utilizarlo. Eso es serializacin. Serializacin es la capacidad que tiene un objeto de persistir su estado en un medio y de ser deserializado a partir de ese medio en la misma mquina o en otra mquina.

Cuando utilizamos el Copy Paste estamos usando el proceso de serializacin ya que cuando le hacemos copy al objeto, lo estamos serializando en alguna parte de la memoria disponible para todos los programas y luego cuando hacemos paste la deserializamos en otra seccin de memoria donde la aplicacin la puede acceder.

El medio a travs del cual podemos persistir un objeto serializado vara desde memoria voltil hasta archivos.

Serializacin y .NET
.NET tiene dos formas de trabajar con la serializacin, una que es estndar y esta por defecto en todas las clases que queremos serializar en la cual el framework determina como se serializa el objeto y otra en la cual nosotros sobre escribimos esa mecnica de serializacin y procedemos a implementar la nuestra.

El Mecanismo por Defecto


En el mecanismo por defecto implica el uso de del mecanismo estndar de serializacin que utiliza .NET. La contraparte de la serializacin es la deserializacin. Para volver un objeto serializable se debe marcar la clase con el atributo Serializable; tal y como se ve en el siguiente cdigo.

El resto del trabajo lo hace el framework. Por defecto existen dos tipos de serializacin en .NET: 1. Serializacin Binaria: Preserva la fidelidad de los tipos lo cul es til para preservar el estado del objeto durante invocaciones diferentes de una aplicacin. Un ejemplo de esta serializacin es el uso del clipboard - copy paste. Un objeto se puede serializar a un stream, a un disco, a memoria, por la red, etc.

2. Serializacin XML: Serializa solamente las propiedades pblicas y los campos y no preserva la fidelidad del tipo.Dado que XML es un estndar abierto es una opcin atractiva para compartir datos en la Web. Para llevar cabo la serializacin y la deserializacin .NET utiliza lo que se conoce como los Formatters - formateadores.

Formatters
Para serializar un objeto tenemos que utilizar unas clases que se conocen como Formatters. Para cada tipo de serializacin debe de existir un Formatter. Por lo tanto, el framework tiene de paquete 2 formateadores en .NET: BinaryFormatter y XmlFormatter. BinaryFormatter Esta clase serializa o deserializa un objeto, o el grafo entero de objetos conectados en formato binario. Al decir grafo entero, me refiero a que si un objeto tiene una relacin de cualquier tipo: herencia, composicin, agregacin, etc. y tiene una instancia viva del objeto, si el objeto en la relacin es serializable se serializar con el objeto que se desea serializar. Para serializar un objeto con el binary formatter ste debe de estar marcado como serializable y luego debe de procederse con el siguiente cdigo. Primero ocupamos estos namespaces para poder interactuar con archivos y para tener acceso al formateador que vamos a utilizar para la serializacin.

Seguidamente ponemos el cdigo para serializar una instancia de la clase cliente.

En este caso estamos serializando el objeto y guardndolo en un archivo, la instancia del objeto se guarda en el objeto _fs que es un file stream que va a crear un archivo llamado datos.dat en el directorio donde se ejecute el archivo ejecutable. Al ejecutar este cdigo se ver el siguiente archivo con el objeto serializado de forma binaria

Deserializar el Objeto Y qu hacemos con un objeto en este formato y en ese archivo? Pues lo podemos transportar a otra mquina y desearializarlo para uso. Para deserializar este objeto procedemos con el siguiente cdigo.

Como vemos en el cdigo anterior, debemos convertir el objeto serializado a la variable del tipo previamente definida - en este caso _cliente. XmlFormatter Otra forma de serializar un objeto en .NET es con el XmlFormatter. Para llevar a cabo la serializacin en XML de un objeto, debemos tener al objeto marcado como serializable y el objeto que estamos utilizando debe de tener un constructor sin parmetros. Luego inicializamos el objeto a partir de sus propiedades. La clase cliente luce ahora as.

El atributo [NoSerialized] es explicado en el siguiente apartado. Seguidamente procedemos a escribir el cdigo para serializar el objeto, el cual es muy similar al de formateador binario, con la nica excepcin de que en este caso vamos a utilizar el constructor vaco y vamos a inicializar el objeto a travs de sus propiedades. Por supuesto adems, vamos a utilizar el XmlFormatter.

Como vemos cuando creamos el formateador le enviamos el tipo de la clase que vamos a serializar, esto con el fin de que sepa la estructura del XML en donde se va a persistir el objeto. El documento XML generado por el cdigo anterior es el siguiente:

Para deserializar el objeto procedemos con el siguiente cdigo:

El archivo se deserializa como un objeto cliente de los que declaramos normalmente.

Atributos no Serializables
Seguidamente pensemos en la posiblidad de no querer serializar todo el objeto para no enviar informacin importante. Por ejemplo, no serializar el salario de un empleado, solo reportar que el empleado esta activo con nosotros. En este caso vamos a poner en nuestros ejemplo un nuevo atributo y una nueva propiedad para la direccin, pero no vamos a serializar estos elementos. El cdigo de la nueva clase es la siguiente:

Como vemos en el cdigo anterior, marcamos el atributo direccin como no serializable, esto le indica al serializador que ignore el contenido del mismo. El cdigo para serializar sigue siendo el mismo solo que a la hora de crear la instancia del objeto le agregamos el valor en la inicializacin.

Igualmente para deserializar utilizamos el mismo mtodo, pero esta vez escribimos el valor de la direccin para verificar si este valor fue incluido en la serializacin.

Como vemos en la pantalla de resultado, el atributo direccin no tienen ningn valor.

Objetos No Serializables
Para poder crear un grafo de objetos serializables, todos los objetos que pertenecen a la relacin se deben poder serializar, es decir estar marcados con el atributo [Serializable]. Si no tenemos nuestras clases en el grafo a serializar marcadas con el atributo mencionado anteriormente vamos a tener una excepcin. Por ejemplo, supongamos que tenemos una clase factura como la que se muestra en el siguiente cdigo.

Ntese que la clase Factura no esta marcada como serializable. Ahora modificamos la clase cliente para que tenga una referencia a la clase Factura de la siguiente forma:

Si procedemos a serializar la clase cliente, vamos a tener un error de serializacin dado que el grafo de serializacin del mismo no esta completo porque la clase factura no esta serializada. El error que obtendramos es el siguiente:

Para que este error no nos suceda debemos marcar la clase Factura como serializable para as poder completar el grafo de serializacin.

Serializacin Personalizada
Si la serializacin que esta por defecto en .NET no funciona como se espera en el sentido en que no serializa los datos como nosotros deseamos, .NET nos da la posibilidad de modificar este comportamiento y hacerlo funcionar de la forma en que nosotros deseamos. Para crear

una serializacin personalizada debemos implementar la interface ISerializable y marcar la clase como serializable. Cuando implementamos ISerializable debemos implementar un mtodo llamado GetObjectData el cual nos va a permitir serializar el objeto como nosotros deseamos. Este mtodo tiene un parmetro del tipo SerializationInfo el cual nos permite ingresar los valores al proceso de serializacin con el nombre que nosotros deseamos y con el valor que queramos; esta es una de las ventajas de este tipo de serializacin puesto que puedo modificar los valores antes de agregarlo a la clase que va ser serializada. Para deserializar la clase procedemos a implementar un constructor para la clase que reciba los mismos parmetros del mtodo GetObjectData y a partir de la instancia del parmetro SerializationInfo procedemos a obtener los valores de los atributos serializados a travs del mtodo GetObjectData. En el cdigo siguiente se puede ver la clase Factura modificada para que sea serializada de forma personalizada:

Como podemos ver, la clase tiene implementado el mtodo GetObjectData y el constructor para deserializar. Ahora porcedemos con el mismo cdigo que utilizamos para serializar la clase que da un error porque Factura no est marcada como Serializable, solamente que esta vez le agregamos datos a la clase factura.

Con esto, ya podemos acceder la clase factura deserializada en nuestro grafo y con valores ingresados de forma manual. El cdigo de la deserializacin es el sigiuente:

Consideraciones de Desempeo
Aunque el mecanismo por defecto es el ms simple de utilizar no es el que tiene el mejor desempeo. Esto porque la serializacin personalizada es ms granular y permite serializar estrictamente solo el cdigo que se requiere. Otro punto a considerar son los grafos de referencia. Entre ms referencias haya a distintas clases serializables ms tiempo dura en generar la serializacin de todo el rbol de relaciones. En estos casos es mejor utilizar la serializacin personalizada para no serializar relaciones innecesarias o atributos innecesarios de otros objetos.

You might also like