Antes de adentrarnos en la serialización de XML con .NET, para los
que no conozcan el concepto de serialización, explicaré algunos
conceptos básicos. La serialización consiste en pasar una instancia
de un objeto a datos que pueden ser guardados en un medio de
almacenamiento, como por ejemplo un fichero. Así también, existe la
operación opuesta conocida como deserialización, que consiste en
crear una instancia de un objeto a partir de unos datos.
Centrándonos en el tema que nos interesa, la serialización de XML
consiste en convertir una instancia de un objeto en un XML, y la
deserialización consiste en convertir un XML en una instancia de un
objeto.
Quizá usted se está preguntando para qué puede servir esto, pues
bien, la serialización se utiliza por ejemplo para guardar el
estado de sesión en una página web o para copiar objetos al
portapapeles de Windows.
En el caso concreto de la serialización de XML, podemos utilizarlo
además como una forma para simplificar la gestión de nuestros XML
más complejos.
Aunque todos estos conceptos parecen muy abstractos, una vez que
nos ponemos manos a la obra son bastante sencillos, así que no
daremos más rodeos.
Esquema XSD
Para empezar crearemos un esquema XSD, que es una definición
genérica que sirve para determinar la estructura que debe tener un
XML válido para ese esquema XSD, aunque la sintaxis para crear un
XSD no es sencilla podemos utilizar cualquier aplicación de las
muchas disponibles en el mercado para generar XML, como por ejemplo
XMLSPY. La creación de un XSD queda fuera del alcance de este
artículo, pero realizar un esquema XSD, con XMLSPY por ejemplo,
resulta una labor muy sencilla, pudiendo incluso generarlo
automáticamente a partir de cualquier XML que tengamos.
Por eso debemos asegurarnos que los XML que vamos a tratar son
válidos para el esquema XSD; si algún XML de los que vamos a
serializar no es válido para el esquema XSD no se podrá realizar la
serialización.
Creación automática de la clase
Una vez que ya tenemos nuestro esquema XSD tan sólo tenemos que
ejecutar una instrucción en la línea de comandos de Visual Studio
.NET, obteniendo una clase para poder serializar nuestro XML. La
instrucción a ejecutar es la siguiente:
xsd.exe -c -l:c#
-n:miclase miEsquema.xsd
XSD es una herramienta del SDK de .NET Framework, al que le pasamos
como parámetros el nombre de la clase que vamos a generar y el
nombre del fichero XSD que contiene el esquema XML.
También podemos observar que podemos determinar el lenguaje en el
que deseamos que nos genere la clase, que en este ejemplo es
C#.
Si vemos el código generado en la clase comprobaremos que se ha
generado una clase por cada nodo del XML y los elementos de cada
nodo están representados por propiedades de la clase. Además
podemos comprobar que existen atributos de metadatos personalizados
junto a algunas declaraciones de la clase, como por ejemplo el
campo producto tiene el siguiente atributo de metadatos
[System.Xml.Serialization.XmlElementAttribute("producto")], que
sirve para que el serializador genere un array de elementos de tipo
producto.
Serialización y deserialización
Ya tenemos creada nuestra clase a partir del esquema XSD, ahora
sólo nos queda leer el fichero XML que deseamos deserializar y
podemos comprobar lo sencillo que resulta trabajar con los datos de
nuestro XML una vez que están deserializados en un objeto.
Para realizar los procesos de serialización y deserialización
utilizaremos la clase XmlSerializer de .NET tal y como se indica en
el siguiente código de ejemplo en C#. Ver fuente 4.
A partir de ahora ya tenemos nuestro objeto factura, en el cual
están todos los datos referentes al XML deserializado, accediendo a
las propiedades de este objeto podemos leer todos los nodos de
nuestro XML.
Por ejemplo, si queremos leer el nodo fecha tan sólo tendremos que
poner en nuestro código:
miFactura.fecha
O si queremos acceder al elemento nombreproducto de nuestro segundo
nodo de productos tendremos que poner en nuestro código:
miFactura.producto[1].nombreproducto
Como hemos podido comprobar acceder ahora un XML resulta muy
sencillo, y la cantidad de código a escribir para leer cualquier
XML se reduce notablemente.
Pero la serialización no sólo nos ofrece ventajas para leer XML,
también nos ofrece muchas ventajas a la hora de escribir un
XML.
Como ya explicamos con anterioridad, para escribir un XML en un
fichero realizaremos una serialización de una instancia de nuestro
objeto.
Veamos un ejemplo en C# en el fuente 5.
En el código del fuente 4 podemos comprobar cómo vamos escribiendo
las propiedades de nuestro objeto, y posteriormente rellenamos el
array de productos. Pues bien, estas propiedades que estamos
escribiendo serán posteriormente los elementos de nuestro XML y
cada posición del array de productos se convertirá en un nodo de
nuestro XML.
Para serializar nuestro objeto y pasarlo a un fichero XML tan sólo
debemos utilizar de nuevo la clase serializer de .NET. Así hemos
conseguido de forma sencilla y con una clara orientación a objetos
escribir un fichero XML.
Conclusión
En resumen, hemos podido comprobar como la serialización, además de
podernos ser útil para guardar el estado de sesión en una página
Web o para copiar objetos al portapapeles de Windows, es también
muy útil para tratar con XML.
La serialización de XML nos ahorra escribir código y nos simplifica
la lectura y escritura de los mismos.