Serialización en .Net

La serialización es el proceso de convertir el estado de un objeto en un formato que se pueda almacenar o transportar. El complemento de serialización es deserialización, que convierte una secuencia en un objeto. Juntos, estos procesos permiten almacenar los datos y transferirlos con facilidad.

La serialización binaria: conserva fidelidad de tipo, que es útil para conservar el estado de un objeto entre las invocaciones diferentes de una aplicación. Por ejemplo, puede compartir un objeto entre distintas aplicaciones si lo serializa en el Portapapeles. Puede serializar un objeto en una secuencia, un disco, la memoria, a través de la red, etc. La comunicación remota utiliza la serialización para pasar objetos "por valor" de un equipo o dominio de aplicación a otro.

La serialización XML: serializa solo propiedades públicas y campos y no conserva la fidelidad de tipo. Esto es útil si se desea proporcionar o utilizar los datos sin restringir la aplicación que utiliza los datos. Dado que XML es un estándar abierto, es una opción atractiva para compartir los datos por el web. SOAP es igualmente un estándar abierto, que lo convierte en una opción atractiva.

Serialización binaria

Si tenemos una clase y deseamos serializarla solo bastara con agregarle el atributo [Serializable], ejemplo:

[Serializable]
public class Clase
{
    public int numero = 15;
    public bool boleano = true;
    public string cadena = "texto";
}

Con esto nuestra clase ya se puede serializar o sea ser guardada en disco o enviada por la red. Para guardarla en disco en formato binario hacemos lo siguiente:

Primero agregamos los espacios de nombres:

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

Luego serializamos el objeto deseado, en nuestro caso c, debe existir la carpeta c:\serializar

//clase a serializar marcada con el atributo [Serializable]
Clase c = new Clase();

//serializador binario
IFormatter format = new BinaryFormatter();

//crear el archivo c.bin donde se almacenara nuestra clase serializada
using (Stream str = new FileStream(@"c:\serializar\c.bin", FileMode.Create))
{
    //serializar el objeto c y almacenarlo en c.bin
    format.Serialize(str, c);
}

Con esto tenemos nuestra clase almacenada en archivo c.bin el cual podemos enviar por la red por ejemplo, y luego recuperar los datos de este modo:

//serializador binario
IFormatter format = new BinaryFormatter();

//abrir el archivo c.bin
using (Stream str = new FileStream(@"c:\serializar\c.bin", FileMode.Open))
{
    //deserializar el objeto c almacenado en c.bin
    Clase c = format.Deserialize(str) as Clase;

    Console.WriteLine("{0}\n{1}\n{2}", c.boleano, c.cadena, c.numero);
}

La serialización binaria es muy eficiente pero en ocasiones no necesitamos eficiencia sino portabilidad en estos casos es mejor utilizar SoapFormatter, el uso es similar al método anterior solo debemos cambiar BinaryFormatter por SoapFormatter y listo, para que funcione debemos agregar una referencia a la siguiente dll.


También debemos agregar en espacio de nombres

using System.Runtime.Serialization.Formatters.Soap;

Utilizamos Soap de igual manera que Binary, ejecutando los métodos Serialize y Deserialize de la interfaz IFormatter.
Si no deseamos serializar todos los campos de una clase podemos utilizar el atributo [NonSerialized], aplicándolo a cada campo que deseemos excluir de la serialización.

[Serializable]
class Clase
{
    public int numero = 15;

    [NonSerialized]
    public bool boleano = true;

    public string cadena = "texto";
}


Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Conociendo la clase cv::Mat de OpenCV