[How To] Serializador anidado utilizando la clase XmlSerializer

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.