c# XML和实体类之间相互转换(序列化和反序列化)[砖]

news/2025/6/19 18:29:52

link: http://blog.okbase.net/haobao/archive/62.html

by: 好饱

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
/// <summary>
/// Xml序列化与反序列化
/// </summary>
public class XmlUtil
{
    #region 反序列化
    /// <summary>
    /// 反序列化
    /// </summary>
    /// <param name="type">类型</param>
    /// <param name="xml">XML字符串</param>
    /// <returns></returns>
    public static object Deserialize(Type type, string xml)
    {
        try
        {
            using (StringReader sr = new StringReader(xml))
            {
                XmlSerializer xmldes = new XmlSerializer(type);
                return xmldes.Deserialize(sr);
            }
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /// <summary>
    /// 反序列化
    /// </summary>
    /// <param name="type"></param>
    /// <param name="xml"></param>
    /// <returns></returns>
    public static object Deserialize(Type type, Stream stream)
    {
        XmlSerializer xmldes = new XmlSerializer(type);
        return xmldes.Deserialize(stream);
    }
    #endregion
    #region 序列化
    /// <summary>
    /// 序列化
    /// </summary>
    /// <param name="type">类型</param>
    /// <param name="obj">对象</param>
    /// <returns></returns>
    public static string Serializer(Type type, object obj)
    {
        MemoryStream Stream = new MemoryStream();
        XmlSerializer xml = new XmlSerializer(type);
        try
        {
            //序列化对象
            xml.Serialize(Stream, obj);
        }
        catch (InvalidOperationException)
        {
            throw;
        }
        Stream.Position = 0;
        StreamReader sr = new StreamReader(Stream);
        string str = sr.ReadToEnd();
         
        sr.Dispose();
        Stream.Dispose();
        return str;
    }
    #endregion
}

下面是测试代码:

 

1. 实体对象转换到Xml

 

1
2
3
4
5
6
7
8
9
public class Student
{
    public string Name { set; get; }
    public int Age { set; get; }
}
Student stu1 = new Student() { Name = "okbase", Age = 10 };
string xml = XmlUtil.Serializer(typeof(Student), stu1);
Console.Write(xml);

2. Xml转换到实体对象

 

1
2
Student stu2 = XmlUtil.Deserialize(typeof(Student), xml) as Student;
Console.Write(string.Format("名字:{0},年龄:{1}", stu2.Name, stu2.Age));

3. DataTable转换到Xml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 生成DataTable对象用于测试
DataTable dt1 = new DataTable("mytable");   // 必须指明DataTable名称
dt1.Columns.Add("Dosage", typeof(int));
dt1.Columns.Add("Drug", typeof(string));
dt1.Columns.Add("Patient", typeof(string));
dt1.Columns.Add("Date", typeof(DateTime));
// 添加行
dt1.Rows.Add(25, "Indocin", "David", DateTime.Now);
dt1.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
dt1.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
dt1.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
dt1.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
// 序列化
xml = XmlUtil.Serializer(typeof(DataTable), dt1);
Console.Write(xml);

4. Xml转换到DataTable

 

1
2
3
4
5
6
7
8
9
10
11
12
13
// 反序列化
DataTable dt2 = XmlUtil.Deserialize(typeof(DataTable), xml) as DataTable;
// 输出测试结果
foreach (DataRow dr in dt2.Rows)
{
    foreach (DataColumn col in dt2.Columns)
    {
        Console.Write(dr[col].ToString() + " ");
    }
    Console.Write("\r\n");
}

5. List转换到Xml

 

1
2
3
4
5
6
7
8
// 生成List对象用于测试
List<Student> list1 = new List<Student>(3);
list1.Add(new Student() { Name = "okbase", Age = 10 });
list1.Add(new Student() { Name = "csdn", Age = 15 });
// 序列化
xml = XmlUtil.Serializer(typeof(List<Student>), list1);
Console.Write(xml);

6. Xml转换到List

 

1
2
3
4
5
List<Student> list2 = XmlUtil.Deserialize(typeof(List<Student>), xml) as List<Student>;
foreach (Student stu in list2)
{
    Console.WriteLine(stu.Name + "," + stu.Age.ToString());
}

从代码可以看到,千变万化不离其宗!


https://dhexx.cn/news/show-156334.html

相关文章

andoid的socket测试为什么出现这个错误:java.net.ConnectException: failed to connect to /192.168.0.8

基于android的Socket通信: Android与服务器的通信方式主要有两种&#xff0c;一是Http通信&#xff0c;一是Socket通信。两者的最大差异在于&#xff0c;http连接使用的是“请求—响应方式”&#xff0c;即在请求时建立连接通道&#xff0c;当客户端向服务器发送请求后&#x…

ABAP OO练习

继续我们的看实例学习abap面向对象编程.在此次的例子中,我们以雇员的工资为蓝图,设计一个程序,然后再一步一步的改进我们写的程序,使其有更好的扩展性以及维护性.该例中所使用的基类是employee类,其子类包括:boss类,不管工作多长时间,他总是有固定的周薪(好爽!).销售员类commis…

[Github 项目推荐] 一个更好阅读和查找论文的网站

机器学习发展到现在&#xff0c;已经积累了非常多的文章&#xff0c;特别是深度学习火起来后&#xff0c;每年新增加的论文非常多&#xff0c;如果需要研究某个领域&#xff0c;不仅需要阅读这个领域经典的论文&#xff0c;也必须时刻关注最新的学术进展&#xff0c;比如最近两…

解决: java.net.ConnectException: Connection refused: connect

java.net.ConnectException: Connection refused: connect 1. 报错如上。 2. 原因和解决&#xff1a; 1&#xff09;端口号被占用&#xff1a;杀死占用端口号&#xff08;一般为8080&#xff09;的进程&#xff0c;释放端口&#xff1b;彻底关闭 Tomcat 服务器&#xff0c;或…

Spring中的@Transactional(rollbackFor = Exception.class)属性详解

序言 今天我在写代码的时候&#xff0c;看到了。一个注解Transactional(rollbackFor Exception.class)&#xff0c;今天就和大家分享一下&#xff0c;这个注解的用法&#xff1b; 异常 如下图所示&#xff0c;我们都知道Exception分为运行时异常RuntimeException和非运行时异常…

Python面向对象编程学习笔记2

以上方式不推荐使用 以上方式不推荐使用 转载于:https://www.cnblogs.com/chickenwrap/p/10264932.html

更改Eclipse下Tomcat的部署目录

使用eclipse开发是因为机器不够用myeclipse&#xff0c;eclipse也比myeclipse清爽很多&#xff0c;启动速度也快。这里的搭建开发环境使用&#xff1a; Jdk1.6Tomcat6Eclipse JEE&#xff0c; 工作目录如下环境目录如下&#xff1a; 安装路径&#xff1a; C:\Java\Jdk1.6.0 C:\…

Redis 主从切换的集群管理

2019独角兽企业重金招聘Python工程师标准>>> Redis单点时&#xff0c;当一台机器挂机了&#xff0c;redis的服务完全停止&#xff0c;这时就会影响其他服务的正常运行。下面利用redis sentinel做一个主从切换的集群管理。 下面两段官方的说辞&#xff1a; Redis Sen…

sql server alter(转)

1、修改字段名&#xff1a; alter table 表名 rename column A to B 2、修改字段类型&#xff1a; alter table 表名 alter column 字段名 type not null 3、修改字段默认值  alter table 表名 add default (0) for 字段名 with values 如果字段有默认值&#xff0c;则需要先…

使用Jmeter发送post请求的两种方式

之前我们有介绍过&#xff0c;常见的接口测试类型包括get型接口和post型接口。使用Jmeter进行接口测试时&#xff0c;get型接口的参数通常写在http请求的路径中&#xff0c;可以使用用户自定义变量和函数助手等方式进行参数化。而post型请求的参数不能随url发送&#xff0c;而是…