[email protected]

Asunción, PARAGUAY

Ingeniería y desarrollo de software, emprendimiento, cursos

21 de febrero de 2017

[How To] Serializador anidado utilizando la clase XmlSerializer

.NET 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.

Hey, we've just launched a new custom color Blogger template. You'll like it - https://t.co/quGl87I2PZ
Suscribíte al boletín