C# 中 IXmlSerializable 接口的最佳實踐和指導原則
實現 IXmlSerializable
接口時,應遵循某些指導原則和最佳實踐,以確保對象的正確序列化和反序列化。
GetSchema() 方法
IXmlSerializable
的 GetSchema()
方法通常應返回 null
。根據官方文檔,此方法是保留的,不應使用。如果您需要指定自定義架構,請改為將 XmlSchemaProviderAttribute
應用於類。
ReadXml() 方法
WriteXml() 方法
WriteXml()
中,框架將負責寫入包裝元素。您的實現應該只在該包裝器內寫入對象的屬性。 處理子對象
示例
以下實現基於上述指導原則:
<code class="language-csharp">public class MyCalendar : IXmlSerializable { [XmlElement] public string Name { get; set; } [XmlElement] public bool Enabled { get; set; } [XmlElement] public Color Color { get; set; } public List<MyEvent> Events = new List<MyEvent>(); public XmlSchema GetSchema() => null; public void ReadXml(XmlReader reader) { reader.MoveToContent(); if (reader.LocalName != "MyCalendar") throw new XmlException("意外的元素名称。"); Name = reader.GetAttribute("Name"); Enabled = bool.Parse(reader.GetAttribute("Enabled")); Color = Color.FromArgb(int.Parse(reader.GetAttribute("Color"))); while (reader.ReadToFollowing("MyEvent")) { var evt = new MyEvent(); evt.ReadXml(reader); Events.Add(evt); } reader.ReadEndElement(); } public void WriteXml(XmlWriter writer) { writer.WriteAttributeString("Name", Name); writer.WriteAttributeString("Enabled", Enabled.ToString()); writer.WriteAttributeString("Color", Color.ToArgb().ToString()); foreach (var evt in Events) { writer.WriteStartElement("MyEvent"); evt.WriteXml(writer); writer.WriteEndElement(); } } }</code>
對應的 XML
<code class="language-xml"><mycalendar color="-14069085" enabled="True" name="Master Plan"><myevent start="start-value" stop="stop-value" title="Write Code"></myevent><myevent start="start-value" stop="stop-value" title="???"></myevent><myevent start="start-value" stop="stop-value" title="Profit!"></myevent></mycalendar></code>
這些最佳實踐確保您的 IXmlSerializable
實現符合框架的預期,並允許可靠地序列化和反序列化數據。
以上是如何在C#中最好地實現IXMLSerializable接口?的詳細內容。更多資訊請關注PHP中文網其他相關文章!