viernes, 9 de mayo de 2014

Receta No. 2-13 en C#: Persistencia de Datos de Objeto en un Archivo

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

Esta receta va a resultar muy interesante debido a que vamos a aprender a guardar los datos de un objeto en un archivo. Esta tarea es necesaria para la persistencia de los datos de trabajo de una clase de objetos. Además, los conceptos nuevos que vamos a explorar son los de serialización y deserialización.

1. Problema

Los datos de los objetos finalizada la ejecución de la aplicación se pierden debido a la naturaleza volátil de la memoria de trabajo del sistema de cómputo. Necesitamos implementar un sistema de persistencia de los datos de trabajo de los tipos que pertenecen al dominio del problema.

2. Solución

Para llevar a cabo la persistencia de los datos de trabajo de los objetos, recurriremos a formateadores para serializar (sinónimo de persistir datos en la memoria permanente del sistema de cómputo). El artefacto del Framework .NET para serializar los datos de un objeto en memoria permanente es System.IO.FileStream [3].

Por otro parte, el Framework .NET cuenta con otro par de clases para la serialización a estado binario o en formato SOAP [3]:
  • System.Runtime.Serialization.Formatters.Binary.BinaryFormatter [4], y
  • System.Runtime.Serialization.Formatters.Soap.SoapFormatter [5]
Pasemos a la siguiente sección para ver esto con más detalle.

3. Discusión de la Solución

3.1 Serialización

Formalmente, el proceso de serialización consiste en almacenar los datos de trabajo (estado) de una estructura u objeto sobre un soporte almacenamiento persistente: disco duro local, bufer de memoria, o ser transmitida a través de un enlace de red. La representación se puede dar en un formato legible (comprensible para una persona) como puede ser un archivo de texto. Otra representación posible es la binaria; la cual es ilegible. A esta operación, en inglés, también se le conoce como marshalling [9].

La operación opuesta a la serialización, se conoce como deserialización (o en inglés, unmarshalling). Se recupere un flujo de datos desde un archivo (binario o textual) y se reestablece sobre una estructura u objetos. Esta operación recupera el estado de los objetos y los pone en memoria de trabajo.

3.2 Clase BinaryFormatter

Esta clase posee la maquinaria para la serialización y deserializacion de los datos de trabajo de un objeto a memoria persistente. También permite almacenar todo los datos de trabajo de una serie de objetos relacionados (por contención). Los datos de trabajo son almacenados en formato binario.

Firma de la clase:

public sealed class BinaryFormatter : IRemotingFormatter, IFormatter

3.2.1 Ejemplo

Veamos el siguiente ejemplo de serialización y deserialización con esta clase:

Resultado:
Demostración del uso de la clase BinaryFormatter
Figura 1. Demostración del uso de la clase BinaryFormatter.

3.2 Clase SoapFormatter

Persiste y recupera los datos de trabajo de un (o varios que estén relacioandos) objetos utilizando el formato SOAP (enfoque recomendado para interoperabilidad de sistemas heterogéneos).

Firma de la clase:

public sealed class SoapFormatter : IRemotingFormatter, IFormatter

Al igual que BinaryFormatter, SoapFormatter implementan la interfaz System.Runtime.Serialization.IFormatter [6]. Esta interfaz posee los métodos abstractos que implementan las clases mencionadas para lograr serializar y deserializar datos de trabajo de objetos: Serialize [7], y Deserialize [8], respectivamente.

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

Vamos a poner en acción las clases BinaryFormatter y SoapFormatter para demostrar el proceso de persistencia y recuperación de datos de trabajo de objetos sobre un soporte de almacenamiento secundario de un sistema de cómputo:

Archivo Persistencia.cs:

Compilación:


  1. csc /target:exe PersistenciaDatosObjetos.cs

Resultado ejecución:
Ejecución archivo PersistenciaDatos.exe
Figura 2. Ejecución archivo PersistenciaDatos.exe.

Archivos generados en dispositivo de almacenamiento local:
Archivos generados después de la serialización.
Figura 3. Archivos generados después de la serialización.

Contenido del archivo directorio.soap:



[Nota: No se incluye la representación del archivo `directorio.bin` debido a que es ilegible para la interpretación humana.]

5. Conclusiones

Aprendimos a persistir datos de trabajo de objetos sobre memoria persistencia (cualquier dispositivo de almacenamiento secundario: disco duro local, memoria auxiliar USB, disco duro externo, unidad de red, &c). Esto nos resultará de mucha utilidad en guardar el estado de progreso de los datos que debe manipular nuestra aplicación para una recuperación posible y continuidad del trabajo.

Glosario

  • Binario
  • Deserialización
  • Dispositivo de almacenamiento
  • Flujo
  • Formateador
  • Formatter
  • IFormatter
  • Persistencia
  • Recuperación
  • Serialización
  • SOAP
  • Stream

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]: FileStream Class (System.IO) - http://msdn.microsoft.com/en-us/library/system.io.filestream%28v=vs.110%29.aspx
[3]: SOAP, the free encyclopedia - https://en.wikipedia.org/wiki/SOAP
[4]: BinaryFormatter Class (System.Runtime.Serialization.Formatters.Binary) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter%28v=vs.110%29.aspx
[5]: SoapFormatter Class (System.Runtime.Serialization.Formatters.Soap) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.soap.soapformatter%28v=vs.110%29.aspx
[6]: System.Runtime.Serialization.Iformatter - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iformatter%28v=vs.110%29.aspx
[7]: IFormatter.Serialize Method (System.Runtime.Serialization) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iformatter.serialize%28v=vs.110%29.aspx
[8]: IFormatter.Deserialize Method (System.Runtime.Serialization) - http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iformatter.deserialize%28v=vs.110%29.aspx
[9]: Serialization, the free encyclopedia - https://en.wikipedia.org/wiki/Serialization


J

No hay comentarios:

Publicar un comentario

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