XmlSerializer可将XML字符串反序列化为对象列表,需定义匹配的类结构并用包装类处理根容器;若XML无显式根,需手动包装或改用XDocument+LINQ to XML。

用 XmlSerializer 可以直接将 XML 字符串反序列化为对象列表,关键在于类结构要与 XML 层级和命名匹配,并正确处理根容器元素。
定义匹配的类结构
XML 中若包含多个同级子元素(如 ),需用一个“包装类”表示根节点,再用泛型 List 或数组表示子项集合。
例如,有如下 XML:
A 1 B 2
对应类应为:
public class Root
{
[XmlElement("Item")]
public List- Items { get; set; } = new();
}
public class Item
{
public string Name { get; set; }
public int Id { get; set; }
}
使用 XmlSerializer 反序列化
创建 XmlSerializer 实例时传入根类型(如 typeof(Root)),然后调用 Deserialize 方法读取 XML 流或字符串。
- 从字符串反序列化:
var xml = @""; var serializer = new XmlSerializer(typeof(Root)); using var reader = new StringReader(xml); var root = (Root)serializer.Deserialize(reader); // 获取对象列表:root.Items A 1
- 从文件反序列化:
using var fileStream = File.OpenRead("data.xml");
var root = (Root)serializer.Deserialize(fileStream);
处理常见问题
如果 XML 没有显式根容器(比如直接是多个 ),XmlSerializer 无法直接反序列化为 List,因为 XML 必须有且仅有一个根元素。
- 方案一:手动包装成合法 XML(加一层根)
- 方案二:改用
XDocument+ LINQ to XML 手动映射(更灵活)
示例(LINQ to XML 方式):
var doc = XDocument.Parse(xmlString);
var items = doc.Root?.Element("Items")
?.Elements("Item")
.Select(x => new Item
{
Name = x.Element("Name")?.Value,
Id = int.TryParse(x.Element("Id")?.Value, out var i) ? i : 0
})
.ToList();
注意命名与特性标注
默认情况下,XmlSerializer 使用属性名作为 XML 元素名。若需自定义,可用以下特性:
-
[XmlElement("CustomName")]:指定元素名 -
[XmlAttribute("id")]:将属性映射为 XML 属性 -
[XmlRoot("Root")]:指定根元素名(用于类本身) -
[XmlArray("Items")]和[XmlArrayItem("Item")]:更明确地控制集合的序列化格式










