您的位置:首页 > 编程学习 > C# > 正文

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

更多 时间:2013-12-15 类别:编程学习 浏览量:2405

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

C# xml和对象的序列化与反序列化
  •  
  • 为什么要做序列化和反序列化?
  •  
  • .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
    {
        反序列化
     
        序列化
    }
    
    		
  •  

    该封装类的测试代码

     

    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)