sábado, 10 de mayo de 2014

Receta No. 2-14 en C#: Serializar el Estado de un Objeto usando JSON

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En la receta anterior -Persistencia de Datos de Objeto en un Archivo-, aprendimos y pusimos en práctica los conceptos esenciales de serialización: usamos las clases BinaryFormatter y SoapFormatter para serializar/deserializar los datos de trabajo (o estado) de objetos almacenados en las colecciones Hashtable, ArrayList.  En esta nueva ocasión, vamos a utilizar un proceso de serialización alternativo independiente del lenguaje: JSON.

1. Problema

La compañía ABC ha decidido hacer una alianza comercial con la organización XYZ, en busca de nuevas oportunidades en el mercado emergente del desarrollo de soluciones industriales para el sector de la construcción. Estas dos organización cuentan con dos sistemas informáticos de tecnología heterogéneas. Este problema ya fue reportado al arquitecto empresarial para que coordine un proyecto que permita y facilite a los sistemas intercambiar información.

2. Solución

Inmediatamente el arquitecto de software recibió el requisito, planteó varias alternativas para el intercambio de información: parsing de archivos de texto plano generados entre los dos sistemas, luego serán cargados con una utilidad de ETL [4] desarrollada a la medida; alternativamente se planteó otro medio más transparente, inclusive, no crea dependencias respecto a una plataforma en la notación de los datos. El conceptó resonó entre todos los integrantes del equipo de integración: JSON (JavaScript Object Notation).

En esencia, para lograr serializar objetos vía JSON necesitamos de las siguientes acciones programáticas:
  1. Crear un objeto Stream para especificar la ruta de destino y origen: serializar, y deserializar, respectivamente.
  2. Crear una instancia de DataContractJsonSerializer. Al constructor de este tipo se le debe especificar el tipo de dato a serializar/deserializar
    1. El método WriteObject permite serializar el estado de un objeto.
    2. El método ReadObject permite deserializar el estado de un objeto.

3. Discusión de la Solución

Hemos mencionado que la clase DataContractJsonSerializer [6] posee toda la maquinaria para serializar y desarializar el estado de un objeto utilizando la notación JSON. Antes de continuar, explicaré grosso modo la tecnología de notación JSON.

3.1 ¿Qué es JSON?

De acuerdo con [2, 3], JSON es un formato (o estándar) de intercambio de datos liviano. Facilita la lectura/escritura de la representación y de los datos para humanos. En cuanto a las máquinas, se facilita el proceso de parsing [5] y generación de datos estructurados de forma rápida y eficiente.

Estructuras de construcción sobre las que se basa JSON:
  • Colección de pares llave (nombre) / valor. (Se puede analogar esta estructura con las colecciones de C#: Dictionary, Hashtable.)
  • Lista ordenada de valores. (Análogo a los arreglos en C#).
Ejemplo de la representación de JSON:

{
"lenguajes" :
[
{ "nombre": "C#", "plataforma": ".NET" },
{ "nombre": "Java", "plataforma": "JEE" },
{ "nombre": "PHP", "plataforma": "ZEND" }
]
}

Aquí se observa un patrón interesante en la estructuración de los objetos JSON: el elemento (atributo) lenguajes es un contenedor (arreglo, o colección) de otros elementos anidados (los objetos con atributos nombre, y plataforma.)

3.2 La clase DataContractJsonSerializer

Sintaxis declarativa de DataContractJsonSerializer:

public sealed class DataContractJsonSerializer : XmlObjectSerializer

(Más adelante, en otros artículos, describiré la naturaleza hereditaria desde XMLObjectSerializer.)

Continuo con la descripción de esta clase. Según [1], esta clase pertenece al grupo de artefactos de la plataforma .NET para el intercambio de datos entre un cliente y un servicio (interoperabilidad). Se suma también el soporte nativo para la serialización/deserialización de tanto de colecciones como de objetos desde y hacia JSON. Esta clase es dependiente de los tipos (clases, interfaces, y estructuras) localizados en los assemblies System.ServiceModel.Web [8] y System.Runtime.Serialization [9].

En la introducción de esta sección he especificado que para crear una instancia de DataContractJsonSerializer es necesario especificar el tipo de dato (invocando a GetType -cfr. El Método GetType y el Operador typeof en C#-) a serializar/deserializar. Una vez instanciado un objeto, pasamos a invocar al método WriteObject (sobrecargado)  [11] para serializar el estado del objeto.

Continuando, el método ReadObject (sobrecargado) [12] lo usamos para la operación inversa, es decir, para deserializar (unmarshalling) el objeto desde una fuente de datos JSON. El tipo del objeto devuelto por ReadObject es object, ergo, es necesario hacer el casting correspondiente para el tipo que esperamos manipular.

Recurramos a la sección práctica para concretar este método de serialización.

4. Práctica: Código Fuente C#

En este ejemplo vamos a serializar los elementos de una lista (List) de elementos tipo string. Una vez serializado, veremos el resulado con notación JSON:


Compilación:


  1. csc /target:exe SerializacionJson.cs

Ejecución:


  1. .\SerializacionJson.exe

Resultado:
Resultado ejecución .\SerializacionJson.exe
Figura 1. Resultado ejecución .\SerializacionJson.exe.

5. Conclusiones

Conocimos los métodos WriteObject y ReadObject de la clase DataContractJsonSerializer, útiles para serialización y deserialización desde y hacia la notación JSON. Conocimos que JSON es un estándar para representar datos a modo de colecciones y listas secuenciales. Concretamos en la sección práctica el uso de los métodos anteriores para demostrar la serialización de un objeto List.

6. Glosario

  • Deserialización
  • Estándar JSON
  • JSON
  • Notación
  • Serialización

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: JSON - http://json.org/
[3]: JSON, the free encyclopedia - https://en.wikipedia.org/wiki/Json
[4]: Extract, transform, load, the free encyclopedia - https://en.wikipedia.org/wiki/Extract,_transform,_load
[5]: Parsing, the free encyclopedia - https://en.wikipedia.org/wiki/Parsing
[6]: DataContractJsonSerializer Class (System.Runtime.Serialization.Json) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer%28v=vs.110%29.aspx
[7]: An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET - http://msdn.microsoft.com/en-us/library/bb299886.aspx
[8]: System.ServiceModel.Web Namespace () - http://msdn.microsoft.com/en-us/library/system.servicemodel.web%28v=vs.110%29.aspx
[9]: System.Runtime.Serialization Namespace () - http://msdn.microsoft.com/en-us/library/system.runtime.serialization%28v=vs.110%29.aspx
[10]: El Método GetType y el Operador typeof en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/el-metodo-gettype-y-el-operador-typeof.html
[11]: DataContractJsonSerializer.WriteObject Method (System.Runtime.Serialization.Json) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.writeobject%28v=vs.110%29.aspx
[12]: DataContractJsonSerializer.ReadObject Method (System.Runtime.Serialization.Json) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.readobject%28v=vs.110%29.aspx


J

No hay comentarios:

Publicar un comentario

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