C# XML序列化详解

发布时间:2023-05-17

一、XML序列化概述

XML序列化是指将一个对象转换为XML格式的过程,使其能够被存储、传输或者在不同环境中使用。在C#中,XML序列化是通过在类上添加[Serializable]属性来实现的,通过使用XmlSerializer类来实现序列化和反序列化。 下面是一个简单的示例:

[Serializable]
public class Person 
{
    public string Name { get; set; }
    public int Age { get; set; }
}
var person = new Person() { Name = "张三", Age = 18 };
var serializer = new XmlSerializer(typeof(Person));
using (var stream = new FileStream("person.xml", FileMode.Create))
{
    serializer.Serialize(stream, person);
}

上面的代码将一个Person对象序列化成了XML格式,并将其保存为person.xml文件。

二、XML序列化属性的控制

在上方示例中,Person类的所有属性都被序列化了。但有时候我们需要控制哪些属性被序列化,哪些属性不被序列化。可以用[XmlIgnore]属性来实现:

[Serializable]
public class Person 
{
    public string Name { get; set; }
    [XmlIgnore]
    public int Age { get; set; }
}

三、XML序列化枚举类型和数组

XML序列化也支持对枚举类型和数组的序列化。例如:

[Serializable]
public enum Gender 
{
    Male,
    Female
}
[Serializable]
public class Person 
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
    public int[] Scores { get; set; }
}

默认情况下,枚举类型和数组都被序列化。但是,枚举类型可能不太容易阅读。我们可以使用[XmlEnum]属性来指定序列化后的值。例如:

[Serializable]
public enum Gender 
{
    [XmlEnum("男")]
    Male,
    [XmlEnum("女")]
    Female
}

四、XML序列化命名空间

默认情况下,XML文档不包含命名空间信息。但是,在一些情况下,我们需要将序列化的类名、属性名等加上命名空间。可以通过[XmlRoot][XmlElement]属性来实现:

[Serializable]
[XmlRoot(Namespace="http://www.example.com")]
public class Person 
{
    [XmlElement(Namespace="http://www.example.com/person")]
    public string Name { get; set; }
    [XmlElement(Namespace="http://www.example.com/person")]
    public Gender Gender { get; set; }
    [XmlElement(Namespace = "http://www.example.com/score")]
    public int[] Scores { get; set; }
}

五、XML序列化自定义类型

当一个类有引用其他类作为属性时,序列化时就会出现问题。例如:

[Serializable]
public class Person 
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
    public List<Job> Jobs { get; set; }
}
[Serializable]
public class Job
{
    public string Name { get; set; }
    public int Salary { get; set; }
}

我们需要对Job类进行简单的更改,以便让Person类可以序列化:

[Serializable]
public class Job
{
    [XmlAttribute]
    public string Name { get; set; }
    [XmlAttribute]
    public int Salary { get; set; }
}

上面的代码使用[XmlAttribute]属性来指定NameSalary属性为XML的属性,在序列化时可以被正确地处理。

六、XML序列化的性能问题

XML序列化是一个非常灵活的技术,但在处理大量数据时可能会成为性能瓶颈。一些技巧可以帮助提高XML序列化性能:

  • 使用StreamWriter而不是FileStream:使用StreamWriter可减少磁盘I/O压力。
  • 使用[XmlArray][XmlArrayItem]属性:这两个属性在序列化数组时非常有用,可以降低XML文档大小。
  • 使用[XmlArray][XmlArrayItem]属性:这两个属性在序列化数组时非常有用,可以降低XML文档大小。

七、总结

XML序列化是一个在C#编程中非常常见的技术。通过使用[Serializable]属性和XmlSerializer类,可以轻松地将对象序列化成XML格式,然后在不同环境中使用。在序列化时,我们需要考虑属性的控制、枚举类型的转换、命名空间的问题以及性能问题。