특정 속성 (예 : 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
}
XmlSerializer를 "확장"하는 정교한 방법을 구현하는 우아한 방법을 보여주는 흥미로운 기사 가 있습니다 .
기사는 말합니다 :
IXmlSerializable은 공식 문서에 포함되어 있지만 문서는 공용으로 사용되지 않으며 그 이상의 정보는 제공하지 않습니다. 이는 개발 팀이 확장 성 후크를 수정, 비활성화 또는 완전히 제거 할 수있는 권한을 보유하고 있음을 나타냅니다. 그러나 이러한 불확실성을 수용하고 향후 가능한 변경 사항을 처리 할 수있는 한,이를 활용할 수없는 이유는 없습니다.
이것이 IXmlSerializable
너무 복잡한 구현을 피하기 위해 자신의 클래스 를 구현하는 것이 좋습니다 .
... XmlSerializer
리플렉션을 사용하여 사용자 정의 클래스 를 구현하는 것이 간단 할 수 있습니다 .