Manteniendo el estado de nuestros objetos en un archivo en Disco Duro

En cuantas ocasiones nos hemos encontrado con la necesidad de guardar la información presente en la interface de usuario de nuestras aplicaciones para que el usuario pueda continuar sus actividades el día siguiente.

Cuando esto nos sucede nos vemos batallando con la idea de generar archivos de texto separado por comas y otras ideas que creemos geniales, pero que en muchas ocasiones nos llevarían varios días enteros en crearlos. Y por lo tanto una idea que sonaba genial termina en la lista de nice to have que tu aplicación nunca tendrá.

Pues a esto en .NET se le llama serialización y dentro del framework existen 2 espacios de nombres que te permitirán aprovechar esta característica sin necesidad de pasar varias horas para guardar la información al disco.

Lo primero que tendrías que hacer es crear una clase que represente la información en la pantalla. Posteriormente a dicha clase le deberás agregar el atributo [Serializable]. Algo que deberás tener en cuenta es que a partir de ese momento tu podrás serializar dicho objeto. Lo cual significa que se generara una representación binaria o en Xml de los campos contenidos dentro de tu objeto. Entiéndase por campos las variables públicas y privadas contenidas dentro de tu clase.

Por lo tanto deberás tener cuidado que cada una de esas propiedades, públicas o privadas sean serializables a su vez ya que en caso contrario podría arrojarte la aplicación una excepción en tiempo de ejecución.

Pero bueno esto solo debería preocuparte si tus campos son en realidad de un tipo por referencia y no en los casos en el que el tipo de tus campos sea por valor. Como es el caso de (int, bool, etc…)

Una vez que has marcado tu clase como serializable puedes elegir ciertos campos que no desees que puedan ser serializados. Como puede ser el campo sueldo o algún campo que contenga una definición a una clase no serializable. Una vez que encuentres este tipo de campos deberás marcarlos con el atributo [NonSerialized].

Así se vería una clase llamada Persona en código.



[Serializable]
class Persona
{
private int idPersona;

public int IdPersona
{get { return idPersona; }
set { idPersona = value; }}

private string apellidoPaterno;
public string ApellidoPaterno
{get { return apellidoPaterno; }
set { apellidoPaterno = value; }}

private string apellidoMaterno;
public string ApellidoMaterno
{get { return apellidoMaterno; }
set { apellidoMaterno = value; }}

private string nombres;
public string Nombres
{get { return nombres; }
set { nombres = value; }}

[NonSerialized]
private float sueldo;
public float Sueldo
{get { return sueldo; }
set { sueldo = value; }}
}

Una vez que has realizado lo anterior deberías poder serializar
la información para poder guardarla en el disco duro y luego
deserializarla para cargar la clase en memoria.

Lo primero que deberías hacer es agregar los siguientes using



using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

Y posteriormente dos botones que realizen la serializacion
y la deserialización



private void cmdBinarySerialization_Click(
object sender, EventArgs e)
{
Persona xPersona = new Persona();
xPersona.IdPersona = 5;
xPersona.ApellidoPaterno="Lopez";
xPersona.ApellidoMaterno="Perez";
xPersona.Nombres ="Ivan";
xPersona.Sueldo =float.Parse("20.00");

BinaryFormatter sf = new BinaryFormatter();
FileStream stream =
new FileStream(
@"c:\xPersona.dat",FileMode.OpenOrCreate);
sf.Serialize (stream,xPersona);
stream.Close();
}

private void cmdBinaryDeserialization_Click(
object sender, EventArgs e)
{
BinaryFormatter sf = new BinaryFormatter();
FileStream stream = new FileStream(
@"c:\xPersona.dat", FileMode.Open);
Persona xPersona =(Persona) sf.Deserialize(stream);
stream.Close();
MessageBox.Show(
string.Format ("{0} {1} {2}",
xPersona.ApellidoPaterno,
xPersona.ApellidoMaterno,
xPersona.Nombres));
}

Si posteriormente en lugar de utilizar una serialización binaria quisieras
utilizar una serialización XML basada utilizando SOAP deberías agregar el
siguiente using:



using System.Runtime.Serialization.Formatters.Soap;

y posteriormente deberías cambiar en el código de los botones de
BinaryFormatter a SoapFormatter. Y eso sería todo.

Espero este ejemplo les resulte tan fascinante como a mí me pareció.

Saludos