lunes, 10 de diciembre de 2012

[C#] Serializar y deserializar objetos en XML

En este post veremos como guardar un objeto c# a un archivo xml y como cargarlo. Código Serializador

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace Datos
{
    public static class SerializadorXML
    {
        public static object Deserializar(XmlDocument xml, Type type)
        {
            XmlSerializer s = new XmlSerializer(type);
            string xmlString = xml.OuterXml.ToString();
            byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlString);
            MemoryStream ms = new MemoryStream(buffer);
            XmlReader reader = new XmlTextReader(ms);
            object o = null;
            try
            {
                o = s.Deserialize(reader);
            }
            finally
            {
                reader.Close();
            }
            return o;
        }

        public static T Deserializar(XmlDocument xml)
        {
            return (T)Deserializar(xml, typeof(T));
        }

        public static XmlDocument Serializar(object o)
        {
            XmlSerializer s = new XmlSerializer(o.GetType());
            XmlDocument xml = null;
            MemoryStream ms = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(ms, new UTF8Encoding());
            writer.Formatting = Formatting.Indented;
            writer.IndentChar = ' ';
            writer.Indentation = 5;

            try
            {
                s.Serialize(writer, o);
                xml = new XmlDocument();
                string xmlString = ASCIIEncoding.UTF8.GetString(ms.ToArray());
                xml.LoadXml(xmlString);
            }
            finally
            {
                writer.Close();
                ms.Close();
            }
            return xml;
        }
    }
}

Ejemplo

// Clase que almacenaremos
public class Persona
{
    private string nombre;
    public string Nombre
    {
        get { return nombre; }
        set { nombre = value; }
    }

    private DateTime nacimiento;
    public DateTime Nacimiento
    {
        get { return nacimiento; }
        set { nacimiento= value; }
    }

    /* SUPONIENDO QUE NO QUIERO QUE SE GUARDE ESTO: */
    private bool fooBar;
    [XmlIgnore] // << Agrego este atributo a la property
    public bool FooBar
    {
        get { return fooBar; }
        set { fooBar = value; }
    }
}

// Clase administradora de nuestro ejemplo
public static class Ejemplo
{
    public static Persona CargarPersona(string file)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(file);
        return SerializadorXML.Deserializar(doc);
    }   

    public static void GuardarPersona(string file, Persona persona)
    {
        XmlDocument doc = SerializadorXML.Serializar(persona);
        doc.Save(file);
    }
}

0 comentarios:

Publicar un comentario