Si necesita manejar atributos específicos (es decir, Diccionario, o cualquier clase), puede implementar la interfaz IXmlSerialiable , que le dará más libertad a costa de una codificación más detallada .
public class NetService : IXmlSerializable
{
#region Data
public string Identifier = String.Empty;
public string Name = String.Empty;
public IPAddress Address = IPAddress.None;
public int Port = 7777;
#endregion
#region IXmlSerializable Implementation
public XmlSchema GetSchema() { return (null); }
public void ReadXml(XmlReader reader)
{
// Attributes
Identifier = reader[XML_IDENTIFIER];
if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
}
public void WriteXml(XmlWriter writer)
{
// Attributes
writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
}
private const string XML_IDENTIFIER = "Id";
private const string XML_NETWORK_ADDR = "Address";
private const string XML_NETWORK_PORT = "Port";
#endregion
}
Hay un artículo interesante , que muestra una forma elegante de implementar una forma sofisticada para "extender" el XmlSerializer.
El artículo dice:
IXmlSerializable está cubierto en la documentación oficial, pero la documentación indica que no está destinado al uso público y no proporciona información más allá de eso. Esto indica que el equipo de desarrollo quería reservar el derecho de modificar, deshabilitar o incluso eliminar completamente este enganche de extensibilidad en el futuro. Sin embargo, mientras esté dispuesto a aceptar esta incertidumbre y lidiar con posibles cambios en el futuro, no hay razón alguna para que no pueda aprovecharla.
Debido a esto, sugiero implementar sus propias IXmlSerializable
clases, para evitar implementaciones demasiado complicadas.
... podría ser sencillo implementar nuestra XmlSerializer
clase personalizada utilizando la reflexión.