Jika Anda perlu menangani atribut tertentu (mis. Kamus, atau kelas apa pun), Anda dapat mengimplementasikan antarmuka IXmlSerialiable , yang akan memberi Anda lebih banyak kebebasan dengan biaya lebih banyak coding verbose .
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
}
Ada artikel yang menarik , yang menunjukkan cara elegan untuk mengimplementasikan cara canggih untuk "memperluas" XmlSerializer.
Artikel itu mengatakan:
IXmlSerializable tercakup dalam dokumentasi resmi, tetapi dokumentasi menyatakan itu tidak dimaksudkan untuk penggunaan umum dan tidak memberikan informasi lebih dari itu. Ini menunjukkan bahwa tim pengembangan ingin memiliki hak untuk memodifikasi, menonaktifkan, atau bahkan menghapus sepenuhnya kemungkinan perpanjangan ini di jalan. Namun, selama Anda bersedia menerima ketidakpastian ini dan menghadapi kemungkinan perubahan di masa depan, tidak ada alasan apa pun yang tidak dapat Anda manfaatkan darinya.
Karena ini, saya sarankan untuk mengimplementasikan IXmlSerializable
kelas Anda sendiri , untuk menghindari implementasi yang terlalu rumit.
... bisa langsung menerapkan XmlSerializer
kelas kebiasaan kami menggunakan refleksi.