Christian Amado

Christian Amado

Ingeniero de software, desarrollador
Diseñado adaptado de Todd Motto

Simple serializador utilizando la clase XmlSerializer
Feb 14, 2017
lectura de 2 minutos
Editar entrada

En ocasiones es necesario que nuestras clases puedan verse como archivos XML estructurados, lo primero que se nos viene a la cabeza es que necesitamos armar todo un conjunto de reglas para poder ajustar los detalles según sean necesarios.

Vamos a colocar un escenario común de complejidad media. Digamos que tenemos un servicio Web en Java el cual necesita un XML formateado según las especificaciones de éste. El archivo XML que el servicio Web Java necesita es como sigue:

Entonces lo que debemos hacer es utilizar la clase XmlSerializer, para poder convertir nuestra clase en un archivo XML según la necesidad o bien convertir de XML a un objeto que hayamos creado.

Serializar una clase

Aquí recibimos como parámetro un objeto y lo convertimos a XML.

Primeramente, creamos la clase (que se convertirá al formato XML):

using System;
using System.Xml.Serialization;

namespace ConsoleBlog
{
    [XmlRoot("ejemplo")]
    public class Ejemplo
    {
        private int codigo = 0;
        private string nombre = string.Empty;
        private DateTime fecha = DateTime.Now;
        private string atributo1 = string.Empty;
        private string atributo2 = "soy otro atributo";

        private string nomeincluyen = ":(";

        [XmlElement]
        public int Codigo
        {
            get
            {
                return codigo;
            }

            set
            {
                codigo = value;
            }
        }

        [XmlElement("Texto")]
        public string Nombre
        {
            get
            {
                return nombre;
            }

            set
            {
                nombre = value;
            }
        }

        [XmlElement]
        public DateTime Fecha
        {
            get
            {
                return fecha;
            }

            set
            {
                fecha = value;
            }
        }

        [XmlAttribute]
        public string Atributo1
        {
            get
            {
                return atributo1;
            }

            set
            {
                atributo1 = value;
            }
        }

        [XmlAttribute("otroatributo")]
        public string Atributo2
        {
            get
            {
                return atributo2;
            }

            set
            {
                atributo2 = value;
            }
        }

        [XmlIgnore]
        public string Nomeincluyen
        {
            get
            {
                return nomeincluyen;
            }

            set
            {
                nomeincluyen = value;
            }
        }
    }
}

El método para serializar la clase y convertirlo a XML sería:

public static string SerializarXML()
{
    //XML a ser retornado
    string resultado = string.Empty;

    //Variables para definición de XML
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    XmlSerializer serializer = new XmlSerializer(typeof(Ejemplo));
    Ejemplo ejemplo = new Ejemplo();
    Encoding encoding = Encoding.GetEncoding("UTF-8");          
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
    {
        Indent = true,
        OmitXmlDeclaration = false,
        Encoding = encoding
    };

    //Agregar un espacio de nombres vacío
    ns.Add("", "");

    //Se utiliza using para que el objeto sea eliminado luego de su uso
    using (var stream = new MemoryStream())
    {
        //Creamos un XML
        using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
        {
            //Convertimos la clase en XML
            serializer.Serialize(xmlWriter, ejemplo, ns);
        }
        //Asignamos el XML creado a nuestra variable
        resultado = encoding.GetString(stream.ToArray());
    }

    return resultado;
}

Luego realizamos la llamada y retornamos el XML:

static void Main(string[] args)
{
    string xml = Program.SerializarXML();

    Console.WriteLine(xml);

    Console.ReadKey();
}

Deserializar un XML

Aquí recibimos como parámetro una cadena de caracteres (string) y lo convertimos a un objeto .NET.

Primeramente, creamos el método (que convertirá el formato XML a un objeto):

public static Ejemplo DeserializarXML(string xml)
{
    //Objeto a ser retornado
    Ejemplo resultado = null;
    //Variables
    XmlSerializer serializer = new XmlSerializer(typeof(Ejemplo));
    //Lector de XML
    using (TextReader reader = new StringReader(xml))
    {
        try
        {
            //Convertimos XML a clase
            resultado = serializer.Deserialize(reader) as Ejemplo;
        }
        catch (Exception ex)
        {
            //Si hay error lo imprimimos
            Console.WriteLine(ex.Message);
        }
    }

    return resultado;
}

Luego realizamos la llamada y retornamos el objeto.

Feb 9, 2017

AX 2012: Importar/exportar proyectos en AOT

En esta entrada intentaré explicar cómo importar/exportar proyectos privados/compartidos en Microsoft Dynamics AX 2012 R3....

Feb 16, 2017

AX 2012: Index versus Index Hint

Debido a este punto he tenido algunas discusiones con mis colegas debido a las diferencias...