温馨提示×

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

c#
小樊
82
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