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