网站链接: 我爱捣鼓
当前位置: 首页 > web开发  > Asp.net/C#

C#实用类XmlUtil-xml和对象序列化、反序列化方法-附源码

2021/4/10 17:44:20

xml在项目中的应用非常广泛,比如可以用来作为不同模块之间接口交互的数据格式,或用来对数据进行本地化的存储(如配置文件)。命名空间System.Xml.Serialization提供了对xml进行反序列化及对对象序列化的功能,使用进来非常方便。C#中xml和对象的序列化与反序列化就要引…

我们在说C#中xml和对象序列化、反序列化方法之前,我们先来说说xml的基本知识。

XML的特点:

        (1) XML可以从HTML中分离数据。即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上。

        (2) XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有多种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。 [4] 

        (3) XML可应用于B2B中。例如在网络中交换金融信息, 目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。 

        (4)利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单。

        (5) XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。

        (6) XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Intemet程序的工具,它就采用了XML的标准。

        总之XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

        xml在项目中的应用非常广泛,比如可以用来作为不同模块之间接口交互的数据格式,或用来对数据进行本地化的存储(如配置文件)。命名空间System.Xml.Serialization提供了对xml进行反序列化及对对象序列化的功能,使用进来非常方便。C#中xml和对象的序列化与反序列化就要引用该命名空间

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

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

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

        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进行反序列化,如下代码
        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序列化和反序列化 封装类

        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

        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

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

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

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

List<Student> list2 = XmlUtil.Deserialize(typeof(List<Student>), xml) as List<Student>;

以上就是C#/xml和对象序列化、反序列化的类源码,大家直接可以拿去就能用哦,后面还举例说明该类的使用方法,希望对大家有所帮助!

相关资讯

  • C#怎么获取文件夹里所有的图片文件?

    在实际的程序开发中,我们经常需要获取某个文件夹下的所有图片,用到了C#的DirectoryInfo、GetFiles等文件操作方法,具体实现如下://自定义一个结构public struct sFileInfo{ public string FileName; public DateTime FileCreateTime;}protected void Page_Load(…

    2021/3/4 21:48:01
  • c#实现日期时间与unix时间戳互相转换

    为什么使用时间戳?关于Unix时间戳,大概是这个意思,从1970年0时0分0秒开始到现在的秒数.使用它来获得的是一个INT值,储存在数据库里只要使用INT格式就可以了,方便数据库进行排序,搜索,而且比datetime格式更节省数据库空间。 /// <summary> /// Uni…

    2021/3/4 21:40:22