Christian Amado

Christian Amado

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

Serializador anidado utilizando la clase XmlSerializer
Feb 21, 2017
lectura de 2 minutos
Editar entrada

En esta ocasión, nos basaremos en la entrada publicada la semana pasada aquí.

En esta ocasión necesitamos obtener un XML anidado con varios elementos y sus respectivos atributos:

?<?xml version="1.0" encoding="utf-8"?>
<ejemplo>
  <padre>
    <hijo Atributo1="" otroatributo="soy otro atributo">
      <Codigo>0</Codigo>
      <Texto />
      <Fecha>2017-02-24T14:30:05.2897119-03:00</Fecha>
    </hijo>
  </padre>
</ejemplo>

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 Padre padre_ = new Padre();

        [XmlElement("padre")]
        public Padre Padre
        {
            get
            {
                return padre_;
            }

            set
            {
                padre_ = value;
            }
        }
    }

    [XmlType("padre")]
    public class Padre
    {
        private Hijo hijo_ = new Hijo();

        [XmlElement("hijo")]
        public Hijo Hijo
        {
            get
            {
                return hijo_;
            }

            set
            {
                hijo_ = value;
            }
        }
    }

    [XmlType("hijo")]
    public class Hijo
    {
        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();
}

Para deserializar se utiliza el mismo método utilizado en el artículo anterior.

Feb 16, 2017

AX 2012: Index versus Index Hint

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

Feb 23, 2017

AX 2012: Administrar excepciones desde X++

En AX, las excepciones funcionan de igual manera que en cualquier lenguaje de programación. Lo...