首頁 >後端開發 >C++ >如何在C#中最好地實現IXMLSerializable接口?

如何在C#中最好地實現IXMLSerializable接口?

DDD
DDD原創
2025-01-27 14:36:14923瀏覽

How to Best Implement the IXmlSerializable Interface in C#?

C# 中 IXmlSerializable 接口的最佳實踐和指導原則

實現 IXmlSerializable 接口時,應遵循某些指導原則和最佳實踐,以確保對象的正確序列化和反序列化。

GetSchema() 方法

IXmlSerializableGetSchema() 方法通常應返回 null。根據官方文檔,此方法是保留的,不應使用。如果您需要指定自定義架構,請改為將 XmlSchemaProviderAttribute 應用於類。

ReadXml() 方法

  • 讀取 XML 時,應已寫入對像元素。讀取對象的屬性後,將讀取器移動到下一個元素。
  • 務必將讀取器移動到包裝對象的結束元素。

WriteXml() 方法

  • WriteXml() 中,框架將負責寫入包裝元素。您的實現應該只在該包裝器內寫入對象的屬性。
  • 避免為對象寫入根元素,因為它假定根元素已寫入。

處理子對象

  • 子對象應使用與父對像類似的方法寫入。
  • 每個子對像都應寫入其自己的 XML 元素。

示例

以下實現基於上述指導原則:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn