Если вам нужно обрабатывать определенные атрибуты (например, Словарь или любой другой класс), вы можете реализовать интерфейс IXmlSerialiable , который предоставит вам больше свободы за счет более подробного кодирования .
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
}
Есть интересная статья , в которой представлен элегантный способ реализации сложного способа «расширения» XmlSerializer.
В статье говорится:
IXmlSerializable описан в официальной документации, но в документации говорится, что она не предназначена для публичного использования, и не предоставляет никакой информации, кроме этого. Это указывает на то, что команда разработчиков хотела оставить за собой право изменить, отключить или даже полностью удалить этот механизм расширения в будущем. Однако до тех пор, пока вы готовы принять эту неопределенность и справиться с возможными изменениями в будущем, нет никаких причин, по которым вы не сможете воспользоваться этим.
Поэтому я предлагаю реализовать собственные IXmlSerializable
классы, чтобы избежать слишком сложных реализаций.
... было бы просто реализовать наш пользовательский XmlSerializer
класс с помощью отражения.