C# XML序列化与反序列化

引用:

using System.IO;

using System.Xml.Serialization;

XML序列化接口(直接copy就能用)

public static string XMLSerialize(Type type,object obj)
        {
            string xmlMessage = string.Empty;

            try
            {
                // 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");

                XmlSerializer serializer = new XmlSerializer(type);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("gb2312"))) 
                    {
                        serializer.Serialize(writer, obj, ns);
                        xmlMessage = Encoding.GetEncoding("gb2312").GetString(ms.GetBuffer());//gb2312编码
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0}", ex.Message);
                return null;
            }

            return xmlMessage;
        }

  反序列化接口

public static object XMLDeserialize(Type type, string xml)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer xmldes = new XmlSerializer(type);
                    return xmldes.Deserialize(sr);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

  接口调用

string str = XMLSerialize(typeof(root), rt); //root是类名 rt是类对象
Console.WriteLine(str);          //打印xml

root Root = XMLDeserialize(typeof(root), str) as root; //xml解析完成获取类对象

例如封装以下格式的xml

<?xml version="1.0" encoding="gb2312"?>
<root command="TestXml">
  <xmlInfo>student</xmlInfo>
  <item command="student" number="1">
    <paraters>
      <name>hello</name>
      <classNo>r1</classNo>
      <sex>boy</sex>
      <birthday>10/23</birthday>
      <year>2017</year>
    </paraters>
  </item>
</root>

 定义类的个数: 从<?xml version="1.0" encoding="gb2312"?>下面一行代码开始, 有xml格式有几层, 就定义(层数-1)个类, 例如:root属于第一层, xmlinfo 和item 属于第二层, parters属于第三层,name,classNo, sex, birthday, year属于第四层, 所以要定义3个类

  定义类的结构: 类的结构根据当前层的属性 和 下一层的节点名称来定义: 例如: class root{属性:command, 节点1:xmlinfo, 节点2: item}, class item{属性 command 节点1:        

                     paraters} class paraters{节点1:name, 节点2: classNo, 节点3: sex, 节点4: birthday, 节点5: year}

  定义结构代码如下:

  

    public class root
    {
        [XmlAttribute] // 注明command为属性, 因为不注明就默认为节点XmlElement
        public string command = "TestXml";
        public string xmlInfo { set;get; } //默认为节点XmlElement
        public Item item { set; get; }
    }
    
        public class Item
    {
        [XmlAttribute]// 注明command为属性, 因为不注明就默认为节点XmlElement
        public string command = "student";
        [XmlAttribute]// 注明number 为属性, 因为不注明就默认为节点XmlElement
        public string number { set; get; }

        public Paraters paraters { set; get; }
    }

    public class Paraters
    {
        public string name { set; get;}
        public string classNo { set; get; }
        public string sex { set; get; }
        public string birthday { set; get; }
        public string year { set; get; }
    }

  生成Xml: 直接new 对象, 对对象中的属性赋值即可

            root rt = new root();
            rt.xmlInfo = "student";
            rt.item = new Item();
            rt.item.number = "1";
            rt.item.paraters = new Paraters();
            rt.item.paraters.birthday = "10/23";
            rt.item.paraters.classNo = "r1";
            rt.item.paraters.name = "hello";
            rt.item.paraters.sex = "boy";
            rt.item.paraters.year = "2017";
            string str = XMLSerialize(typeof(root), rt);
            Console.WriteLine(str);

            root Root = XMLDeserialize(typeof(root), str) as root;
            Console.ReadKey();

  

 

生成多个节点相同的名字的xml:格式如下---------------->一下有三个节点名字都为Paraters

<?xml version="1.0" encoding="gb2312"?>
<root command="TestXml">
  <xmlInfo>student</xmlInfo>
  <item command="student">
    <Items>
      <Paraters>
        <name>hello</name>
        <classNo>r1</classNo>
        <sex>boy</sex>
        <birthday>10/23</birthday>
        <year>20</year>
      </Paraters>
      <Paraters>
        <name>hello</name>
        <classNo>r1</classNo>
        <sex>boy</sex>
        <birthday>10/23</birthday>
        <year>201</year>
      </Paraters>
      <Paraters>
        <name>hello</name>
        <classNo>r1</classNo>
        <sex>boy</sex>
        <birthday>10/23</birthday>
        <year>2018</year>
      </Paraters>
    </Items>
    <number>1</number>
  </item>
</root>

这个格式的xml类主要修改一下 Item类中的一个属性即可:类结构如下所示

    public class root    //没变
    {
        [XmlAttribute]
        public string command = "TestXml";
        public string xmlInfo { set;get; }
        public Item item { set; get; }
    }

    public class Item
    {
        [XmlAttribute]
        public string command = "student";
        public string number { set; get; }
        public List<Paraters> Items; //只修改了这里, 编程list容器
    }

        public class Paraters  //没变
    {

        public string name { set; get;}
        public string classNo { set; get; }
        public string sex { set; get; }
        public string birthday { set; get; }
        public string year { set; get; }
    }

  生成以上格式xml代码:如下:

  

            root rt = new root();
            rt.xmlInfo = "student";
            rt.item = new Item();
            rt.item.number = "1";
            rt.item.Items = new List<Paraters>();

            Paraters paraters = new Paraters();
            paraters.birthday = "10/23";
            paraters.classNo = "r1";
            paraters.name = "hello";
            paraters.sex = "boy";
            paraters.year = "20";
            rt.item.Items.Add(paraters);

            Paraters parater = new Paraters();
            parater.birthday = "10/23";
            parater.classNo = "r1";
            parater.name = "hello";
            parater.sex = "boy";
            parater.year = "201";
            rt.item.Items.Add(parater);

            Paraters parater1 = new Paraters();
            parater1.birthday = "10/23";
            parater1.classNo = "r1";
            parater1.name = "hello";
            parater1.sex = "boy";
            parater1.year = "2018";
            rt.item.Items.Add(parater1);



            string str = XMLSerialize(typeof(root), rt);
            Console.WriteLine(str);

            root Root = XMLDeserialize(typeof(root), str) as root;
            Console.ReadKey();

  终端输出图:

反序列化截图如下:

 

posted @ 2017-06-06 16:30  Software_hul  阅读(337)  评论(0编辑  收藏  举报