viernes, 2 de septiembre de 2011

.NET SERIALIZATION C#

El proceso de serializacion consiste en almacenar una instancia de una clase en un archivo de manera tal que pueda volver a crearse el objeto con sus mismas propiedades cargándolo desde el mismo archivo; es decir si tienes un objeto creado en memoria el cual representa a un automóvil y deseas almacenar el objeto completo para luego volver a hacer referencia a él en otro momento, entonces deberías utilizar serializacion.
Vamos a ver como funciona el proceso de serializacion en .Net
Para nuestro estudio vamos a suponer que tenemos una clase llamada Persona la cual tiene como propiedades el Nombre, el apellido y la Cedula(Numero único de identificación) de la persona.
Para poder serializar una clase esta debe estar marcada con el atributo [Serializable]
[Serializable]
class Persona
        {
            public string _Nombre;
            public string _Apellido;
            public string _Cedula;
                      
        }


El siguiente paso consiste en elegir el tipo de serializador que necesitamos teniendo dentro de nuestras opciones el serializador binario, el serializador xml y otros soportados por el espacio de nombres System.Runtime.Serialization.


Serializador Binario:



 Persona nuevaPersona = new Persona();
            nuevaPersona._Nombre = "Carlos Andres";
            nuevaPersona._Apellido = "Arango Morales";
            nuevaPersona._Cedula = "xxx xxx xxx";


            //Se crea una instancia del formateador binario que implementa la interfaz IFormater
            IFormatter Formatter = new BinaryFormatter();

            //Cramos un Stream para almacenar el archivo en el disco
            Stream stream = new FileStream("PersonaSerializada.bin", FileMode.Create, FileAccess.Write, FileShare.None);

            //Utilizamos el Formatter para serializar el objeto en el stream

            Formatter.Serialize(stream, nuevaPersona);
            stream.Close();



De esta forma tendríamos en la carpeta de la aplicación un nuevo archivo llamado PersonaSerializada.bin con caracteres no fácilmente comprensibles por los humanos pero en el cual esta almacenado el objeto.


Deserializador Binario:



Si deseamos leer el objeto desde el archivo entonces debemos leer el archivo utilizando un Stream Reader para luego por medio del Formatter realizar un Cast al tipo de objeto a los datos retornados por el Formatter.


 IFormatter Formatter2 = new BinaryFormatter();
            Stream stream2 = new FileStream("PersonaSerializada.bin", FileMode.Open, FileAccess.Read, FileShare.Read);

            //Esta es la parte importante
            //Despues de tener el objeto en el stream creamos el objeto declarando el contenedor y realizando
            //un Cast del contenido del stream a la clase que deseamos deserializar

            Persona PersonaDesSerializada = (Persona) Formatter2.Deserialize(stream2);


Ahora tenemos en memoria en el objeto PersonaDesSerializada el contenido del objeto persona creado inicialmente.


Existen varios de tipos de serializadores los cuales son importantes y mas efectivos en algunos casos pero el proceso es muy similar al que vimos en este apartado del blog.





El código completo lo pueden encontrar en este link Serializacion












5 comentarios:

  1. Carlos, como seria un ejemplo si quisiera eventualmente guardar un arreglo,lista o cualeskier estuctura? Haga de cuenta que quiero llevar a Persona misPersonas[50] a un archivo o un List lstPersonas. En ese caso me interesa saber el tamano en bytes que ocupa el registro asi como se maneja en c++?

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Te dejo un ejemplo en skydrive con nombre Serializar Lista.rar
    https://skydrive.live.com/redir.aspx?cid=db247cc6be194b45&resid=DB247CC6BE194B45!175

    ResponderEliminar
  5. básicamente se crea una lista a la cual se agregan varios objetos de tipo persona y se serializa de forma binaria la lista con el mismo código del ejemplo

    eso si la clase persona tiene que estar marcada como serializable

    ResponderEliminar