文档章节

C# xml和对象的序列化与反序列化

KavenSu
 KavenSu
发布于 2014/02/21 23:54
字数 1036
阅读 655
收藏 5


为什么要做序列化和反序列化?

 

.Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。

 

 

一段最简单的Xml序列化代码

 

 

C# 代码   复制

class Program{    static void Main(string[] args)    {        int i = 10;        //声明Xml序列化对象实例serializer        XmlSerializer serializer = new XmlSerializer(typeof(int));        //执行序列化并将序列化结果输出到控制台        serializer.Serialize(Console.Out, i);        Console.Read();    }}

上面代码对int i进行了序列化,并将序列化的结果输出到了控制台,输出结果如下

<?xml version="1.0" encoding="gb2312"?>
<int>10</int>

 

将上述序列化的xml进行反序列化,如下代码


 

C# 代码   复制

static void Main(string[] args){    using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?><int>10</int>"))    {        //声明序列化对象实例serializer         XmlSerializer serializer = new XmlSerializer(typeof(int));        //反序列化,并将反序列化结果值赋给变量i        int i = (int)serializer.Deserialize(rdr);        //输出反序列化结果        Console.WriteLine("i = " + i);        Console.Read();    }}

以上代码用最简单的方式说明了xml序列化和反序列化的过程,.Net系统类库为我们做了大量的工作,序列化和反序列化都非常简单。但是在现实中业务需求往往比较复杂,不可能只简单的序列化一个int变量,显示中我们需要对复杂类型进行可控制的序列化。

 

System.Xml.Serialization类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容:


    公共类的公共读写字段或者属性
    XmlElement对象
    XmlNode对象
    Dataset对象
    实现了Icollection 或IEnumerable的类

 

下面介绍 XML序列化和反序列化 封装类

 

 

C# 代码   复制

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     序列化}

 

该封装类的测试代码

 

1. 实体对象转换到Xml

 

C# 代码   复制

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转换到实体对象


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

 

3、DataTable转换到Xml

 

C# 代码   复制

// 生成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
 

 

C# 代码   复制

// 反序列化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
 

 

C# 代码   复制

// 生成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

 

C# 代码   复制

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

 


本文转载自:http://www.studyofnet.com/news/253.html

KavenSu
粉丝 6
博文 66
码字总数 16605
作品 0
深圳
私信 提问
.NET 中的序列化 & 反序列化

序列化:将对象的状态信息及类型信息,转换为一种易于传输或存储形式(流,即字节序列)的过程。 下图为序列化过程图示,图片来自微软官方文档: 反序列化:与序列化相反,将流转换为对象的过...

雪飞鸿
01/28
0
0
C#强化系列文章七:序列化和反序列化

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。 我想最主要...

橘子红了呐
2017/11/05
0
0
XmlSerializer 常见问题

简介 .NET 框架中的 XmlSerializer 是一种很棒的工具,它将高度结构化的 XML 数据映射到 .NET 对象。XmlSerializer 在程序中通过单个 API 调用来执行 XML 文档和对象之间的转换。转换的映射规...

Andrewniu
2018/08/31
0
0
.NET对象的XML序列化和反序列化

序列化的概念 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。 比如,一个计数器,数值为2,我们可以用字符串“2”表示。...

王二狗子11
2017/12/26
0
0
XmlSerializer 对象的Xml序列化和反序列化

这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传...

长平狐
2012/06/08
227
0

没有更多内容

加载失败,请刷新页面

加载更多

一套完整的软件开发流程是怎样的?

做什么事都需要一个流程,软件开发也不例外。 那么,一个软件从无到有到底是怎么开发的?一个软件产品的结果为什么是这样?为什么开发的速度不能再快一点。为什么程序员大多秃顶?他们有那么...

我想造火箭
25分钟前
4
0
漂亮思维导图怎样绘制?教你快速套用思维导图模板绘制d

用MindMaster软件绘制思维导图,会更加高效和美观!因为MindMaster是一款专业的思维导图软件,零基础经验的朋友花费5分钟时间就能掌握它的相关画法。以下是电脑软件思维导图画法的简单步骤。...

工具分享
27分钟前
4
0
linux 软链接与 硬链接的区别

软链接与硬链接的区别 1. 硬链接不会创建inode,即使用的inode都是一样的。软链接会创建新的inode。 2. 硬链接的访问属性和源文件一模一样,没有l的标识。软链接的访问属性写明了是l,且访问...

突突突酱
28分钟前
2
0
新特性解读 | MySQL 8.0.18 有权限控制的复制

原文:Replication with restricted privileges https://mysqlhighavailability.com/replication-with-restricted-privileges/ 作者:Pedro Figueiredo 翻译:管长龙 背景 MySQL 8.0.18 以前......

爱可生
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部