C# XML 序列化与反序列化详解及实战示例
引言
在现代应用开发中,数据的存储和传输常常需要以文本格式进行,以便于跨平台、跨语言的互通。XML 是一种广泛应用的数据格式,而在 C# 中,我们可以通过 XmlSerializer
轻松实现对象与 XML 数据的相互转换。本文将详细介绍 C# 中如何使用 XML 序列化与反序列化,并提供完整的代码示例,帮助你快速掌握这一重要技能。
什么是 XML 序列化?
XML 序列化是指将对象的公共属性和字段转换为 XML 格式的过程。与之对应的反序列化则是将 XML 数据转换回对象。通过 XML 序列化,我们可以将对象保存为 XML 文件或通过网络传输,并能保证数据的结构性和可读性。
XML 序列化的应用场景
- 数据存储:将对象保存为 XML 文件以供后续加载和读取。
- 数据传输:通过 XML 格式在不同系统或不同语言的程序之间传递数据。
- 配置文件:在许多应用中,XML 被用作配置文件格式,程序通过解析 XML 加载配置。
如何实现 XML 序列化与反序列化
1. 定义可序列化的类
在 C# 中,要进行 XML 序列化的类必须满足以下条件:
- 类必须是公共的。
- 类必须有一个无参数的构造函数。
- 需要序列化的字段和属性必须是公共的。
举个简单的例子:
using System;
using System.Xml.Serialization;
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
在这个例子中,Person
类包含两个属性:Name
和 Age
。它们将被序列化到 XML 中。
2. 序列化对象到 XML
接下来,我们将对象转换为 XML 字符串。我们使用 XmlSerializer
类来完成这一步:
using System.IO;
using System.Xml.Serialization;
Person person = new Person { Name = "John", Age = 30 };
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, person);
string xmlOutput = writer.ToString();
Console.WriteLine(xmlOutput);
}
这段代码会输出如下的 XML:
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>John</Name>
<Age>30</Age>
</Person>
在这里,XmlSerializer
将 Person
对象转换为 XML 格式的字符串并输出到控制台。
3. 从 XML 反序列化为对象
反序列化是将 XML 字符串还原为对象。我们可以使用同样的 XmlSerializer
来完成:
using System.IO;
using System.Xml.Serialization;
string xmlInput = @"<Person><Name>John</Name><Age>30</Age></Person>";
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StringReader reader = new StringReader(xmlInput))
{
Person deserializedPerson = (Person)serializer.Deserialize(reader);
Console.WriteLine($"{deserializedPerson.Name}, {deserializedPerson.Age}");
}
这段代码会将 XML 字符串反序列化回 Person
对象,并输出:
John, 30
4. 使用自定义 XML 元素和属性
如果我们想要自定义 XML 中的标签名称或结构,可以使用 XmlElement
和 XmlAttribute
等特性。例如:
public class Person
{
[XmlElement("FullName")]
public string Name { get; set; }
[XmlAttribute("Years")]
public int Age { get; set; }
}
这样,序列化后的 XML 会变成:
<?xml version="1.0" encoding="utf-16"?>
<Person Years="30">
<FullName>John</FullName>
</Person>
结论
XML 序列化在 C# 中是一个非常有用的功能,能够让我们方便地将对象转换为 XML 格式进行存储或传输,同时也可以轻松地将 XML 数据还原为对象。通过 XmlSerializer
类,我们可以在项目中快速实现这一功能。希望本文的讲解和示例能够帮助你更好地理解 C# 中的 XML 序列化和反序列化。
你可以根据项目的需求灵活使用 XmlElement
、XmlAttribute
等特性来自定义 XML 结构,使其更加契合实际应用场景。
扩展类
public static class ConvertExtensions
{
/// <summary>
/// 对象序列化为XML字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="current"></param>
/// <returns></returns>
public static string ToXML<T>(this T current) where T : class
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, current);
string xmlContent = writer.ToString();
return xmlContent;
}
}
/// <summary>
/// 从 XML 反序列化为对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T? XMLDeserialize<T>(this string xml) where T : class
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xml))
{
T? deserializedPerson = (T?)serializer.Deserialize(reader);
return deserializedPerson;
}
}
}
相关资源