在C#开发中,将List对象序列化为XML是数据持久化和跨系统数据交换的常见需求,通过.NET框架自带的相关类库可以快速实现这一功能,无需引入第三方依赖。

序列化前的准备工作
要实现List到XML的序列化,首先需要引入对应的命名空间,同时如果List中存储的是自定义类型的对象,还需要为自定义类添加合适的XML特性标记,确保序列化后的XML结构符合预期。
必要命名空间
序列化操作需要用到System.Xml.Serialization命名空间下的XmlSerializer类,同时如果需要将序列化结果输出到文件,还需要引入System.IO命名空间,对应的引用代码如下:
using System; using System.Collections.Generic; using System.Xml.Serialization; using System.IO;
自定义类的特性标记
如果List中存储的是自定义类的实例,需要为类添加XmlRoot特性指定根节点名称,为类的属性添加XmlElement特性指定每个属性对应的XML节点名称,避免序列化后出现默认的命名空间或者不符合预期的节点名。以下是一个自定义类的示例:
[XmlRoot("Student")]
public class Student
{
[XmlElement("Id")]
public int Id { get; set; }
[XmlElement("Name")]
public string Name { get; set; }
[XmlElement("Age")]
public int Age { get; set; }
}
List序列化为XML的核心实现
完成准备工作后,就可以通过XmlSerializer类实现序列化操作,核心步骤是创建序列化器实例、准备待序列化的List对象、指定输出目标,最后执行序列化方法。
序列化到字符串
如果不需要将XML保存到文件,只是需要获取XML格式的字符串,可以使用StringWriter作为输出目标,具体代码如下:
class Program
{
static void Main(string[] args)
{
// 准备待序列化的List对象
List<Student> studentList = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 20 },
new Student { Id = 2, Name = "李四", Age = 21 }
};
// 创建XmlSerializer实例,指定要序列化的类型
XmlSerializer serializer = new XmlSerializer(typeof(List<Student>), new XmlRootAttribute("Students"));
// 使用StringWriter接收序列化结果
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, studentList);
string xmlResult = writer.ToString();
Console.WriteLine(xmlResult);
}
}
}
上述代码执行后,得到的XML字符串结构如下:
<?xml version="1.0" encoding="utf-16"?>
<Students>
<Student>
<Id>1</Id>
<Name>张三</Name>
<Age>20</Age>
</Student>
<Student>
<Id>2</Id>
<Name>李四</Name>
<Age>21</Age>
</Student>
</Students>
序列化到文件
如果需要将XML保存到本地文件,只需要将输出目标替换为FileStream或者StreamWriter即可,代码如下:
class Program
{
static void Main(string[] args)
{
List<Student> studentList = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 20 },
new Student { Id = 2, Name = "李四", Age = 21 }
};
XmlSerializer serializer = new XmlSerializer(typeof(List<Student>), new XmlRootAttribute("Students"));
// 指定文件路径,使用FileStream写入
string filePath = "students.xml";
using (FileStream stream = new FileStream(filePath, FileMode.Create))
{
serializer.Serialize(stream, studentList);
}
Console.WriteLine("序列化完成,文件已保存");
}
}
常见问题与注意事项
- 如果List中存储的是基本数据类型比如
List<string>,不需要自定义特性,直接序列化即可,序列化后的每个元素会对应一个默认的节点名。 - 自定义类的属性如果是私有的,默认不会被序列化,需要添加
[XmlElement]特性并指定对应的公共访问方式,或者将属性改为公共的。 - 序列化时如果报类型不支持的错误,需要检查自定义类是否有无参构造函数,
XmlSerializer要求被序列化的类必须包含公共的无参构造函数。
补充:XML反序列化为List
完成序列化后,通常还需要将XML反序列化为List对象,反序列化的代码和序列化逻辑类似,使用Deserialize方法即可,示例如下:
class Program
{
static void Main(string[] args)
{
string filePath = "students.xml";
XmlSerializer serializer = new XmlSerializer(typeof(List<Student>), new XmlRootAttribute("Students"));
using (FileStream stream = new FileStream(filePath, FileMode.Open))
{
List<Student> deserializedList = (List<Student>)serializer.Deserialize(stream);
foreach (var student in deserializedList)
{
Console.WriteLine($"Id:{student.Id}, Name:{student.Name}, Age:{student.Age}");
}
}
}
}
C#ListXML序列化XmlSerializer修改时间:2026-06-10 22:48:28