Wenn Sie spezifische Attribute (z. B. Dictionary oder eine Klasse) bearbeiten müssen, können Sie das IXmlSerialiable Interface implementieren, das Ihnen mehr Freiheit ermöglicht kostet jedoch mehr Code.
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
}
Es gibt einen interessanten Artikel, der einen eleganten Weg zeigt, einen ausgeklügelten "Erweiterungsmechanismus" für den XmlSerializer zu implementieren.
Der Artikel sagt:
IXmlSerializable wird in der offiziellen Dokumentation behandelt, aber es wird angegeben, dass es nicht für die öffentliche Verwendung vorgesehen ist und keine weiteren Informationen bereitstellt. Dies zeigt, dass das Entwicklungsteam sich das Recht vorbehalten wollte, diesen Erweiterungspunkt künftig zu ändern, zu deaktivieren oder sogar vollständig zu entfernen. Solange Sie jedoch bereit sind, diese Unsicherheit zu akzeptieren und mit möglichen zukünftigen Änderungen umzugehen, spricht überhaupt nichts dagegen, es zu nutzen.
Aus diesem Grund schlage ich vor, eigene IXmlSerializable
-Klassen zu implementieren, um zu vermeiden, dass zu komplizierte Implementierungen entstehen.
...es könnte einfach sein, unsere eigene benutzerdefinierte XmlSerializer
-Klasse mithilfe von Reflection zu implementieren.