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