jueves, 9 de junio de 2016

Receta C# No. 6-9: Cómo Usar Serialización XML con Objetos Personalizados

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Serialización
5.2 Deserialización
5.3 Clase XmlSerializer
5.3.1 Requerimientos
5.3.2 Atributos
6. Práctica: Serialización Catálogo de Productos
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

.NET Framework cuenta con la clase XmlSerializer para la transferencia de objetos hacia XML, y en sentido contrario. Esta receta explica el proceso por el cual es posible representar un objeto personalizado en formato de serialización basado en el estándar XML. Se presenta los requisitos fundamentales -uso de atributos, constructores predeterminados, propiedades de escritura y lectura- para la serialización de objetos personalizados.

2. Palabras Clave

  • Atributo
  • Constructor predeterminado
  • Deserialización
  • Formato serial
  • Objeto personalizado
  • Propiedad
  • Serialización
  • Servicio Web
  • XML

3. Problema

Usar XML (eXtensible Markup Language) como formato de serialización y deserialización.

4. Solución

Microsoft .NET Framework se cuenta con la clase XmlSerializer para serializar y deserializar objetos en XML, y vice versâ.

5. Discusión de la Solución

5.1 Serialización

La serialización de XML es el proceso por medio del cual se convierten los campos y propiedades públicos de un objeto a un formato serial -para este caso particular, XML-. Este formato es apto para el almacenamiento y transporte ("XmlSerializer Class", 2016) de datos.

5.2 Deserialización

El proceso inverso a la serialización consiste en reconstruir el objeto a partir del formato serial; a este proceso se le conoce como deserialización ("XmlSerializer Class", 2016): XML a objeto.

5.3 Clase XmlSerializer

En el namespace System.Xml.Serialization se encuentra la clase XmlSerializer ("XmlSerializer Class", 2016). En principio, esta clase permite al programador controlar cómo se han de codificar el estado actual de un objeto sobre el formato serial de XML.

Este proceso es recurrente y nativo en la construcción de servicios Web gracias a la facilidad personalización e implementación (Freeman, 2010).

5.3.1 Requerimientos

Para hacer uso de XmlSerializer basta con seguir estos requerimientos:
  • XmlSerializer sólo serializa funciones públicas: propiedades y variables.
  • La clase a serializar ha de incluir un constructor predeterminado, es decir con cero argumentos en su firma.
  • Sin excepción, todas las propiedades han de ser de escritura y lectura.

5.3.1 Atributos

Los atributos son etiquetas o marcas especificadas en determinados elementos de programa (e.g., clases, métodos, propiedades, assemblies, nombre de espacio). Estas etiquetas o marcas definen nuevo comportamiento para el elemento de programa marcado; e inclusive, permite establecer restricciones; como por ejemplo la obsolescencia de un método en futuras versiones de una librería ("Atributos en C#", 2016).

Los atributos también se pueden entender como un mecanismo de extensión de comportamiento declarativo flexible, es decir, sin requerir estructuras programáticas complejas ("Atributos en C#", 2016).

En este caso, la utilidad de los atributos consiste en marcar la definición de una clase personalizada de tal modo que se estructure el mapeo XML deseado. En el namespace System.Xml.Serialization se incluyen estos atributos:
  • XmlRoot: Especifica el nombre del elemento raíz para un documento XML.
  • XmlElement: Especifica el nombre para una propiedad o campo de un elemento XML.
  • XmlAttribute: Especifica que una propiedad o campo deben ser serializados como un atributo. También especifica su nombre.
  • XmlEnum: Determina cómo XmlSerializer serializa un miembro de enumeración.
  • XmlIgnore: Indica que una propiedad o campo no debe ser serializado.

6. Práctica: Serialización Catálogo de Productos

Las siguientes clases representan la estructura del documento XML presentado en Receta C# No. 6-1: Visualización de la Estructura de un Documento XML en un Component TreeView:

La clase -CatalogoProductos- representa la clase contenedora de elementos Producto.

Archivo C# CatalogoProductos.cs [Enlace alternativo][Enlace alternativo]:

Debe notarse como varios atributos -XmlRoot, XmlElement, XmlArray, etceteros- son usados en campos para ser el mapeo a la estructura del documento XML en el archivo CatalogoProductos.xml. Dicho de otro modo, los argumentos especificados en los atributos corresponden con los nombres de elementos y atributos del documento XML.


Como se muestra en la siguiente parte de este ejemplo, estas clases personalizadas permiten a través de la clase XmlSerializer la traducción de XML a objetos C#, y vice versâ.

Archivo C# SerializacionXml.cs [Enlace alternativo][Enlace alternativo]:

En la línea 15 se crea un nuevo objeto CatalogoProducto. Este objeto va a contener una referencia al arreglo de objetos Producto creado en la línea 18.


Entre las tareas más sobresalientes de este archivo de código fuente C# se halla en la línea 24: aquí se crea una nueva instancia de XmlSerializer que se va a encargar de serializar objetos de tipo CatalogoProducto. La información contenida en la variable catalogo:CatalogoProducto será serializada en el archivo XML CatalogoProductos2017.xml.


Más adelante, en la línea 32 se abre el archivo CatalogoProductos2017.xml para deserializarlo con el mismo objeto serializador:XmlSerializer. Esta última operación ocurre en la línea 34.


Finalmente, sobre la línea 37 se muestra el contenido del archivo XML deserializado en la salida estándar: serializador.Serialize(Console.Out, catalogo);.

Compilación:

csc /t:library CatalogoProductos.cs

csc /t:exe /reference:CatalogoProductos.dll SerializacionXml.cs


Ejecución assembly:

.\SerializacionXml.exe

> Prueba ejecución assembly:
Ejecución assembly SerializacionXml.exe
Figura 1. Ejecución assembly SerializacionXml.exe.

Este es el archivo XML que se produce por la serialización del objeto CatalogoProducto:

Archivo XML CatalogoProductos2017.xml [Enlace alternativo]:

7. Conclusiones

Se mostró cómo a través de la clase XmlSerializer se serializan objetos a un formato serial como XML. Este proceso ocurre en sentido contrario: deserialización; en este caso la representación serializada en XML se deserializa en un objeto personalizado.

En la próxima receta C# se crea un esquema para una clase en .NET.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.
XmlSerializer Class (System.Xml.Serialization) (2016, junio 8). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Atributos en C# (2016, junio 8). Recuperado desde: http://ortizol.blogspot.com/2015/07/atributos-en-csharp.html


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.