หากคุณจำเป็นต้องจับคุณลักษณะเฉพาะ (เช่นพจนานุกรมหรือระดับใด ๆ ) คุณสามารถใช้IXmlSerialiableอินเตอร์เฟซซึ่งจะช่วยให้คุณมีอิสระมากขึ้นค่าใช้จ่ายมากขึ้น verbose เข้ารหัส
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
คลาสที่เรากำหนดเองมาใช้โดยใช้การสะท้อน