NOTA: Esta es una entrada extraída de mi anterior blog (de hecho la primera que he escrito), la he decidido publicar porque me consta que ha sido útil.

Muchas veces surge la necesidad de almacenar objetos en ficheros, en memoria, como cadena de caracteres, en una base de datos, etc. Para ello .NET nos facilita la vida primero debemos marcar la clase como “Serializable” y posteriormente proceder a realizar la serialización.

Veremos un ejemplo sencillo:

Serializar un objeto en memoria:

Primero definimos un array de bytes con una longitud estimada (superior a la que va a tener el objeto en cuestión).

byte[] flujosBytes = new byte[LONGITUD];



A continuación, se especifica el formato de la serialización y una nueva instancia de la clase donde lo vamos a serializar (en memoria) pasando por parámetro el array que acabamos de crear.

 

IFormatter formatter = new BinaryFormatter();

Stream stream = new MemoryStream(flujosBytes, true);

Se ejecuta el método Serialize con el flujo y el objeto a serializar (recordad que debe estar marcado como serializable)  y finalmente se cierra el flujo.

formatter.Serialize(stream, objeto);

stream.Close();

Ya tenemos el objeto en forma de array de bytes,  a partir de aquí guardarlo por ejemplo, en un fichero es trivial:

Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);

stream.Write(flujo, 0,flujo.Length);

stream.Close();

Bien,  ya tenemos el objeto serializado y almacenado en un fichero, pero, ¿cómo desserializamos? Pues muy sencillo:

Primero -y siguiendo con el ejemplo- se debe rescatar el flujo de bytes del fichero que acabamos de crear:

Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

byte[] flujo = new byte[LONGITUD];

stream.Read(flujo, 0, flujo.Length);

stream.Close();

Volvemos a tener el flujo del principio, ahora procedemos a convertir el flujo de bytes al objeto inicial:

IFormatter formatter = new BinaryFormatter();

Stream stream = new MemoryStream(flujo, true);

object objectD = (object)formatter.Deserialize(stream);

stream.Close();