如果您需要處理特定的屬性(即字典,或任何一類),您可以實現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
}
有一個有趣的article,其表現出優雅的方式來實現複雜的方式來「擴展」 XmlSerializer的。
文章說:
IXmlSerializable的覆蓋的正式文件,但文件指出它不打算供公衆使用,並提供超出任何信息。這表明開發團隊希望保留修改,禁用或甚至完全刪除這個可擴展性的權利。但是,只要你願意接受這種不確定性,並在將來處理可能的變化,就沒有任何理由不能利用它。
因此,我建議實施你自己的IXmlSerializable
類,以避免太複雜的實現。
...使用反射來實現我們自定義的XmlSerializer
類可能很簡單。
我的對象有一個Uri字段,這引起了這個異常; Uri類沒有無參數的構造函數。謝謝你的提示。 – ford 2011-10-28 21:45:16
在谷歌搜索中遇到了這個問題 - 當我需要成爲List時,我的特殊問題是在我的「被序列化」類中擁有一個屬性爲「IList」。 – 2012-10-08 13:06:59
如何看待「內部例外」? – David 2012-12-17 03:47:59