Belirli nitelikleri (örneğin Sözlük veya herhangi bir sınıf) işlemeniz gerekiyorsa , daha ayrıntılı kodlama pahasına daha fazla özgürlük sağlayacak olan IXmlSerialiable arabirimini uygulayabilirsiniz .
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'ı "genişletmek" için sofistike bir yol uygulamak için zarif bir yol gösteren ilginç bir makale var .
Makale şöyle diyor:
IXmlSerializable resmi belgelerde yer almaktadır, ancak belgelerde genel kullanıma yönelik olmadığını ve bunun ötesinde hiçbir bilgi verilmemektedir. Bu, geliştirme ekibinin bu genişletilebilirlik kancasını yolda değiştirme, devre dışı bırakma ve hatta tamamen kaldırma hakkını saklamak istediğini gösterir. Bununla birlikte, bu belirsizliği kabul etmeye ve gelecekte olası değişikliklerle uğraşmaya istekli olduğunuz sürece, bundan yararlanamayacağınız hiçbir sebep yoktur.
Çünkü bu, IXmlSerializable
çok karmaşık uygulamalardan kaçınmak için kendi sınıflarınızı uygulamanızı öneririm .
... özel XmlSerializer
sınıfımızı yansıma kullanarak uygulamak kolay olabilir .