C# XML 序列化与反序列化详解及实战示例


C# XML 序列化与反序列化详解及实战示例

引言

在现代应用开发中,数据的存储和传输常常需要以文本格式进行,以便于跨平台、跨语言的互通。XML 是一种广泛应用的数据格式,而在 C# 中,我们可以通过 XmlSerializer 轻松实现对象与 XML 数据的相互转换。本文将详细介绍 C# 中如何使用 XML 序列化与反序列化,并提供完整的代码示例,帮助你快速掌握这一重要技能。

什么是 XML 序列化?

XML 序列化是指将对象的公共属性和字段转换为 XML 格式的过程。与之对应的反序列化则是将 XML 数据转换回对象。通过 XML 序列化,我们可以将对象保存为 XML 文件或通过网络传输,并能保证数据的结构性和可读性。

XML 序列化的应用场景

  • 数据存储:将对象保存为 XML 文件以供后续加载和读取。
  • 数据传输:通过 XML 格式在不同系统或不同语言的程序之间传递数据。
  • 配置文件:在许多应用中,XML 被用作配置文件格式,程序通过解析 XML 加载配置。

如何实现 XML 序列化与反序列化

1. 定义可序列化的类

在 C# 中,要进行 XML 序列化的类必须满足以下条件:

  • 类必须是公共的。
  • 类必须有一个无参数的构造函数。
  • 需要序列化的字段和属性必须是公共的。

举个简单的例子:

C# 全选
using System;
using System.Xml.Serialization;

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

在这个例子中,Person 类包含两个属性:NameAge。它们将被序列化到 XML 中。

2. 序列化对象到 XML

接下来,我们将对象转换为 XML 字符串。我们使用 XmlSerializer 类来完成这一步:

C# 全选
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:

C# 全选
<?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>

在这里,XmlSerializerPerson 对象转换为 XML 格式的字符串并输出到控制台。

3. 从 XML 反序列化为对象

反序列化是将 XML 字符串还原为对象。我们可以使用同样的 XmlSerializer 来完成:

C# 全选
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 对象,并输出:

Markup 全选
John, 30
4. 使用自定义 XML 元素和属性

如果我们想要自定义 XML 中的标签名称或结构,可以使用 XmlElementXmlAttribute 等特性。例如:

C# 全选
public class Person
{
    [XmlElement("FullName")]
    public string Name { get; set; }

    [XmlAttribute("Years")]
    public int Age { get; set; }
}

这样,序列化后的 XML 会变成:

C# 全选
<?xml version="1.0" encoding="utf-16"?>
<Person Years="30">
  <FullName>John</FullName>
</Person>

结论

XML 序列化在 C# 中是一个非常有用的功能,能够让我们方便地将对象转换为 XML 格式进行存储或传输,同时也可以轻松地将 XML 数据还原为对象。通过 XmlSerializer 类,我们可以在项目中快速实现这一功能。希望本文的讲解和示例能够帮助你更好地理解 C# 中的 XML 序列化和反序列化。

你可以根据项目的需求灵活使用 XmlElementXmlAttribute 等特性来自定义 XML 结构,使其更加契合实际应用场景。

 

扩展类
C# 全选
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;
     }
 }
} 

相关资源

 

 

 

 

 

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:VSCode正则表达式检索:如何使用正则表达式匹配包含特定属性但排除另一个属性的HTML标签
下一篇:C# .NETCore EF执行SQL语句 字符串转FormattableString
评论列表

发表评论

评论内容
昵称:
关联文章

C# XML 序列序列详解实战示例
CSS backdrop-filter 属性详解使用方法
C#的进化——C#发展史、C#1.0-10.0语法系统性梳理、C#JAVA的对比
C# 解析加载读取XML文件的正确姿势
.NET DLL编译 JustDecompile
.NET C#教程初级篇 1-1 基本数据类型其存储方式
C# 值得永久收藏的WPF项目实战(经典)
C# MEF插件开发
使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL示例项目介绍
企业项目实战.Net Core +FastReport教程一|制作报表模板
C# 将PDF转为线性PDF
C#使用Thrift作为RPC框架实战(四)之TSocket
详解ElasticAPM实现微服务的链路追踪(NET)
C#实现INotifyPropertyChanged的优雅封装方案(含简洁写法自动生成)
简单示例
C# txt文本文件的读取写入,
C#基础系列-过滤器特性
.NET6中一些常用组件的配置使用记录,持续更新中。。。
使用.NET 6开发TodoList应用(27)——实现API的Swagger文档
.NET DLL编译 .NET Reflector

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码