如果您需要处理特定的属性(即 Dictionary 或任何类),您可以实现IXmlSerialable接口,这将允许您以更冗长的编码为代价获得更多的自由。
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 的复杂方式。
文章说:
IXmlSerializable 包含在官方文档中,但文档声明它不打算供公众使用,并且除此之外没有提供任何信息。这表明开发团队希望保留修改、禁用甚至完全删除此可扩展性挂钩的权利。但是,只要您愿意接受这种不确定性并应对未来可能发生的变化,就没有任何理由不能利用它。
因此,我建议实现你自己的IXmlSerializable
类,以避免过于复杂的实现。
XmlSerializer
...使用反射实现我们的自定义类可能很简单。