如果您需要处理特定的属性(即字典,或任何一类),您可以实现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