Se você precisar lidar com atributos específicos (por exemplo, Dictionary ou qualquer classe), poderá implementar a interface IXmlSerialiable , que permitirá mais liberdade ao custo de uma codificação mais detalhada .
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
}
Há um artigo interessante , que mostra uma maneira elegante de implementar uma maneira sofisticada de "estender" o XmlSerializer.
O artigo diz:
IXmlSerializable é abordado na documentação oficial, mas a documentação declara que não se destina ao uso público e não fornece informações além disso. Isso indica que a equipe de desenvolvimento queria reservar o direito de modificar, desativar ou mesmo remover completamente esse gancho de extensibilidade no caminho. No entanto, desde que você esteja disposto a aceitar essa incerteza e lidar com possíveis mudanças no futuro, não há motivo para não tirar proveito disso.
Por isso, sugiro implementar suas próprias IXmlSerializable
classes, a fim de evitar implementações muito complicadas.
... poderia ser simples implementar nossa XmlSerializer
classe personalizada usando reflexão.