首页 >后端开发 >C++ >如何在 C# 中最好地实现 IXmlSerialized 接口?

如何在 C# 中最好地实现 IXmlSerialized 接口?

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# 中最好地实现 IXmlSerialized 接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn