温馨提示×

如何自定义C#的XML序列化

c#
小樊
141
2024-09-14 21:15:01
栏目: 编程语言

在C#中,您可以通过使用特性(Attributes)和实现IXmlSerializable接口来自定义XML序列化

方法1:使用特性(Attributes)

  1. XmlElementAttribute:指定一个元素名称。
  2. XmlAttributeAttribute:将字段或属性序列化为XML属性。
  3. XmlIgnoreAttribute:忽略一个公共字段或属性。
  4. XmlArrayAttribute:将数组或集合序列化为XML数组。
  5. XmlArrayItemAttribute:控制数组或集合中的项目的序列化。
  6. XmlRootAttribute:指定根元素的名称。
  7. XmlTypeAttribute:指定类型的名称。
  8. XmlIncludeAttribute:指示序列化时要包括的额外类型。

示例:

using System; using System.IO; using System.Xml.Serialization; [XmlRoot("Person")] public class Person { [XmlElement("Name")] public string FullName { get; set; } [XmlAttribute("Age")] public int Age { get; set; } [XmlIgnore] public bool IsMale { get; set; } } class Program { static void Main(string[] args) { var person = new Person { FullName = "John Doe", Age = 30, IsMale = true }; var serializer = new XmlSerializer(typeof(Person)); using (var writer = new StreamWriter("person.xml")) { serializer.Serialize(writer, person); } } } 

方法2:实现IXmlSerializable接口

实现IXmlSerializable接口后,您需要提供自定义的读取和写入XML的方法。这样,您可以完全控制序列化和反序列化过程。

示例:

using System; using System.IO; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; public class Person : IXmlSerializable { public string FullName { get; set; } public int Age { get; set; } public bool IsMale { get; set; } public void WriteXml(XmlWriter writer) { writer.WriteStartElement("Person"); writer.WriteElementString("Name", FullName); writer.WriteAttributeString("Age", Age.ToString()); if (IsMale) { writer.WriteElementString("Gender", "Male"); } else { writer.WriteElementString("Gender", "Female"); } writer.WriteEndElement(); } public void ReadXml(XmlReader reader) { reader.ReadStartElement("Person"); FullName = reader.ReadElementString("Name"); Age = int.Parse(reader.GetAttribute("Age")); var gender = reader.ReadElementString("Gender"); IsMale = gender == "Male"; reader.ReadEndElement(); } public XmlSchema GetSchema() { return null; } } class Program { static void Main(string[] args) { var person = new Person { FullName = "John Doe", Age = 30, IsMale = true }; var serializer = new XmlSerializer(typeof(Person)); using (var writer = new StreamWriter("person.xml")) { serializer.Serialize(writer, person); } } } 

这两种方法都可以实现自定义的XML序列化。使用特性(Attributes)的方法更简单,但如果您需要更多的控制权,请实现IXmlSerializable接口。

0