C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

首先我们需要明确两个概念:序列化和反序列化。序列化是将对象转换为XML或JSON格式的文本数据,而反序列化则是将XML或JSON格式的文本数据转换为对象。

C#中,我们可以使用XmlSerializer类来实现XML和实体类之间的序列化和反序列化。以下是详细的步骤:

1. 定义实体类

我们先定义一个Person类来说明这个过程:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

2. 序列化

在代码中创建一个XmlSerializer实例,然后调用Serialize方法将Person对象转换成XML格式的文本:

Person person = new Person()
{
    Name = "John Smith",
    Age = 30,
    Email = "john.smith@example.com"
};

XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, person);
    string result = writer.ToString();
    Console.WriteLine(result);
}

这段代码将会输出以下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 Smith</Name>
  <Age>30</Age>
  <Email>john.smith@example.com</Email>
</Person>

3. 反序列化

反序列化的过程和序列化相反,我们需要使用XmlSerializer类的Deserialize方法将XML格式的文本转换成Person对象:

string 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 Smith</Name>
  <Age>30</Age>
  <Email>john.smith@example.com</Email>
</Person>";

XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StringReader reader = new StringReader(xml))
{
    Person person = (Person)serializer.Deserialize(reader);
    Console.WriteLine(person.Name);
    Console.WriteLine(person.Age);
    Console.WriteLine(person.Email);
}

这段代码将会输出以下结果:

John Smith
30
john.smith@example.com

示例1:序列化和反序列化List对象

上面只是展示了单个对象的序列化和反序列化,实际情况中我们需要序列化的是一个列表,下面给出一个使用List对象的示例。

List<Person> people = new List<Person>()
{
    new Person() { Name = "John", Age = 30, Email = "john@example.com" },
    new Person() { Name = "Jane", Age = 35, Email = "jane@example.com" },
};

XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, people);
    string result = writer.ToString();
    Console.WriteLine(result);
}

// 反序列化
using (StringReader reader = new StringReader(result))
{
    List<Person> deserializedPeople = (List<Person>)serializer.Deserialize(reader);
    foreach (Person person in deserializedPeople)
    {
        Console.WriteLine(person.Name);
        Console.WriteLine(person.Age);
        Console.WriteLine(person.Email);
    }
}

示例2:自定义XML元素名称

有时候我们需要给XML元素指定特定的名称,而不是使用默认的属性名。这时候我们可以使用XmlAttribute或者XmlText特定来标记实体类属性。

public class PersonWithXmlAttribute
{
    [XmlAttribute("FullName")]
    public string Name { get; set; }
    public int Age { get; set; }
    [XmlText]
    public string Email { get; set; }
}

我们可以使用上面的代码创建一个新的PersonWithXmlAttribute对象并将其序列化:

PersonWithXmlAttribute person = new PersonWithXmlAttribute()
{
    Name = "John Smith",
    Age = 30,
    Email = "john.smith@example.com"
};

XmlSerializer serializer = new XmlSerializer(typeof(PersonWithXmlAttribute));
using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, person);
    string result = writer.ToString();
    Console.WriteLine(result);
}

这段代码将会输出以下XML格式的文本:

<?xml version="1.0" encoding="utf-16"?>
<PersonWithXmlAttribute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" FullName="John Smith">john.smith@example.com</PersonWithXmlAttribute>

反序列化同样的方法:

string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
<PersonWithXmlAttribute xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" FullName=""John Smith"">john.smith@example.com</PersonWithXmlAttribute>";

XmlSerializer serializer = new XmlSerializer(typeof(PersonWithXmlAttribute));
using (StringReader reader = new StringReader(xml))
{
    PersonWithXmlAttribute deserializedPerson = (PersonWithXmlAttribute)serializer.Deserialize(reader);
    Console.WriteLine(deserializedPerson.Name);
    Console.WriteLine(deserializedPerson.Age);
    Console.WriteLine(deserializedPerson.Email);
}

这段代码将会输出以下结果:

John Smith
0
john.smith@example.com

注意,因为Age属性没有使用标记,因此当它被反序列化时,它的值将保持为默认值0。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现XML与实体类之间相互转换的方法(序列化与反序列化) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# Random类随机函数实例详解

    C# Random类随机函数实例详解 在C#编程中,经常需要使用到随机数,C#中提供了Random类,可以非常方便地生成伪随机数。本文将针对C# Random类进行详细讲解,并附上两个示例说明。 1. Random类概述 Random类可以生成一个伪随机数序列。 随机数是一些不可预测的数字,它们是通过算法生成的,而不是通过任何物理过程生成的。 随机类的构造函…

    C# 2023年6月8日
    00
  • asp.net文件上传示例分享

    我来为您详细讲解“asp.net文件上传示例分享”的完整攻略。 一、背景介绍 在网站开发中,文件上传功能是比较常用的功能,ASP.NET也提供了方便的文件上传类供我们使用。本攻略将分享ASP.NET文件上传的示例代码,以帮助大家快速了解ASP.NET文件上传功能的实现过程。 二、示例一 2.1 前端页面 在网站的前端页面中,我们需要添加文件上传的控件,以下是…

    C# 2023年5月31日
    00
  • 常用正则 常用的C#正则表达式

    常用正则表达式 正则表达式是一种字符串匹配的工具,通常被用来检索、替换那些符合某个规则的文本。其语法有点特殊,但一旦掌握,可以大大提高我们对文本的处理效率。 常用的正则表达式 以下是一些常用的正则表达式: 匹配手机号: ^1[3-9]\d{9}$ 邮箱:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 身份…

    C# 2023年6月6日
    00
  • 基于WPF编写一个串口转UDP工具

    下面是详细的攻略: 1. 准备工作 首先你需要准备一台装有.NET Framework和WPF开发工具的计算机。然后安装System.IO.Ports和System.Net.Sockets命名空间。 2. 创建WPF应用程序 使用Visual Studio打开一个新的WPF应用程序。然后在MainWindow.xaml中创建一个界面布局,包含按钮、输入框、输…

    C# 2023年6月6日
    00
  • C# using三种使用方法

    下面我将为你详细讲解C#中using语句的三种使用方法。 1. 用法一 第一种方法是using语句的基本用法,其格式为: using (资源申请语句) { // 执行代码 } 该用法可以简化书写资源申请和释放的步骤,例如以下示例: using (FileStream stream = new FileStream("test.txt", …

    C# 2023年5月15日
    00
  • C#实现子类与父类的相互转换

    下面就为您详细讲解C#实现子类与父类的相互转换的完整攻略。 1. 概述 C#中,子类与父类之间的相互转换可以通过以下两种方式实现: 子类对象可以直接转换为父类对象,称为向上转型(upcasting)。 父类对象也可以转换为子类对象,称为向下转型(downcasting)。 2. 向上转型 向上转型是比较简单的,因为子类对象中包含了父类对象的所有属性和方法。所…

    C# 2023年5月15日
    00
  • C#程序员最易犯的编程错误

    C#程序员最易犯的编程错误攻略 1. 不安全的类型转换 在C#中,由于存在隐式类型转换和显式类型转换,程序员很容易使用错误的方式执行类型转换。尤其是从最大的类型(如long或double)向较小的类型(如int或short)转换时,可能会导致精度丢失或溢出的问题。解决这个问题的办法是使用C#的类型转换操作符(as、is、implicit、explicit),…

    C# 2023年5月15日
    00
  • C#集合本质之堆栈的用法详解

    C#集合本质之堆栈的用法详解 什么是堆栈(Stack)? 堆栈是一种特殊的数据结构,它的特点是后进先出(Last In First Out, LIFO)。堆栈通常是通过数组或链表实现的,操作系统在进程调度、函数调用、表达式求值等方面广泛应用了堆栈。 C#堆栈的实现 C#中实现堆栈的数据结构有两种,一种是System.Collections.Stack类,另一…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部