lunes, 2 de noviembre de 2009

Serialización binaria, ejemplo simple

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication14
{
    class Program
    {
        static void Main(string[] args)
        {
            //Crea el formatter que es el encargado de serializar
            var formatter = new BinaryFormatter();

            //Es necesario un Strema de cualquier tipo (un FileStream por ejemplo)
            var stream = new MemoryStream();

            //se instancia el objeto a serializar
            var o = new MyClass() { MyProperty = 1, MyProperty2 = "dos", PropiedadIgnorada ="Ignorar" };
            o.SetValorPrivado(true);

            //Se serializa el objeto y se pone en el Stream
            formatter.Serialize(stream, o);

            var data = stream.ToArray();

            //De-serializamos
            var o2 = (MyClass) formatter.Deserialize(new MemoryStream(data));

            
            //verificamos que el objeto de-serializado sea igual al original
            Debug.Assert(o.MyProperty.Equals(o2.MyProperty));
            Debug.Assert(o.MyProperty2.Equals(o2.MyProperty2));

            //La propiedad que no se serializó queda en null
            Debug.Assert(o2.PropiedadIgnorada==null);

            //notar que se serilizan los valores privados también
            Debug.Assert(o.VerificarValorPrivado().Equals(o2.VerificarValorPrivado()));
        }
    }

    //Las clases para serializar con el serializador binario tienen que estar marcadas
    //como Serilizable
    [Serializable]
    class MyClass
    {
        private bool _private;

        public int MyProperty { get; set; }
        public string MyProperty2 { get; set; }

        //con el atributo NonSerialized se ignoran propiedades
        //que no queremos serilizar
        [System.NonSerialized]
        public string PropiedadIgnorada;

        public void SetValorPrivado(bool valor)
        {
            _private = valor;
        }

        public bool VerificarValorPrivado()
        {
            return _private;
        }
    }
}

1 comentario:

Profesor Sanchez dijo...

Una consulta soy nuevo existe var en C# parece un antigua forma y cuando lo programe FileStream me mando a la b. Pero supongo que probaste este código antes de publico me lo imagino verdad