XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。

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

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

范围:本文只介绍xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化。

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


1

2

3

4

5

6

7

8

9

10

11

12

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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变量,显示中我们需要对复杂类型进行可控制的序列化。

自定义对象的Xml序列化:

System.Xml.Serialization命名空间中有一系列的特性类,用来控制复杂类型序列化的控制。例如XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute等等。

看一个小例子,有一个自定义类Cat,Cat类有三个属性分别为Color,Saying,Speed。


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

namespace UseXmlSerialization

{

    class Program

    {

        static void Main(string[] args)

        {

            //声明一个猫咪对象

            var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            //序列化这个对象

            XmlSerializer serializer = new XmlSerializer(typeof(Cat));

            //将对象序列化输出到控制台

            serializer.Serialize(Console.Out, c);

            Console.Read();

        }

    }

    [XmlRoot("cat")]

    public class Cat

    {

        //定义Color属性的序列化为cat节点的属性

        [XmlAttribute("color")]

        public string Color { getset; }

        //要求不序列化Speed属性

        [XmlIgnore]

        public int Speed { getset; }

        //设置Saying属性序列化为Xml子元素

        [XmlElement("saying")]

        public string Saying { getset; }

    }

}

可以使用XmlElement指定属性序列化为子节点(默认情况会序列化为子节点);或者使用XmlAttribute特性制定属性序列化为Xml节点的属性;还可以通过XmlIgnore特性修饰要求序列化程序不序列化修饰属性。

对象数组的Xml序列化:

数组的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定数组元素的Xml节点名,XmlArrayItemAttribute指定数组元素的Xml节点名。

如下代码示例:


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

/*玉开技术博客 http://www.cnblogs.com/yukaizhao */

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Serialization;

namespace UseXmlSerialization

{

    class Program

    {

        static void Main(string[] args)

        {

            //声明一个猫咪对象

            var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };

            //序列化这个对象

            XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));

            //将对象序列化输出到控制台

            serializer.Serialize(Console.Out, cc);

            Console.Read();

        }

    }

    [XmlRoot("cats")]

    public class CatCollection

    {

        [XmlArray("items"),XmlArrayItem("item")]

        public Cat[] Cats { getset; }

    }

    [XmlRoot("cat")]

    public class Cat

    {

        //定义Color属性的序列化为cat节点的属性

        [XmlAttribute("color")]

        public string Color { getset; }

        //要求不序列化Speed属性

        [XmlIgnore]

        public int Speed { getset; }

        //设置Saying属性序列化为Xml子元素

        [XmlElement("saying")]

        public string Saying { getset; }

    }

}

以上代码将输出:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?xml version="1.0" encoding="gb2312"?>

<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww

w.w3.org/2001/XMLSchema">

  <items>

    <item color="White">

      <saying>White or black,  so long as the cat can catch mice,  it is a good

cat</saying>

    </item>

    <item color="Black">

      <saying>White or black,  so long as the cat can catch mice,  it is a good

cat</saying>

    </item>

  </items>

</cats>

XmlSerializer内存泄漏问题:

多谢chenlulouis,仔细看了下msdn,确实存在泄漏的情况,msdn说明如下:

动态生成的程序集 

为了提高性能,XML 序列化基础结构将动态生成程序集,以序列化和反序列化指定类型。此基础结构将查找并重复使用这些程序集。此行为仅在使用以下构造函数时发生:

XmlSerializer(Type) 
XmlSerializer.XmlSerializer(Type, String)

如果使用任何其他构造函数,则会生成同一程序集的多个版本,且绝不会被卸载,这将导致内存泄漏和性能降低。最简单的解决方案是使用先前提到的两个构造函数的其中一个。否则,必须在 Hashtable 中缓存程序集,如以下示例中所示。

也就是说我们在使用XmlSerializer序列化,初始化XmlSerializer对象时最好使用下面两个构造函数否则会引起内存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

时间: 2024-10-25 13:00:26

XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置的相关文章

C# XmlSerializer 对象的Xml序列化和反序列化

.Net程序执行时,对象都驻留在内存中:内存中的对象如果需要传递给其他系统使用:或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化. System.Xml.Serialization命名空间中有一系列的特性类,用来控制复杂类型序列化.例如XmlElementAttribute.XmlAttributeAttribute.XmlArrayAttribute.XmlArrayItemAttribute.XmlRootAttribute等等. 可以使用XmlElement指定属性序

C#中XML与对象之间的序列化、反序列化

using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Xml.Utility { public static class XmlUtil { /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化

c# XML序列化与反序列化 属性字段标识

序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public

XML 序列化与反序列化

XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param name="type">对象类型</param> /// <param name="obj">对象</param> /// <param name="fileName">序列化的XML文件路径<

C#操作XML序列化与反序列化

1 public class XmlSerializerHelper 2 { 3 /// <summary> 4 /// 从XML文件中反序列化读取对象 5 /// </summary> 6 /// <typeparam name="T"></typeparam> 7 /// <param name="filePath"></param> 8 /// <param name="r

Xml序列化、反序列化帮助类

之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 1 /// <summary> 2 /// 功能:Xml序列化.反序列化帮助类 3 /// 说明: 4 /// 创建人: 5 /// 创建时间:2014年3月13日 6 /// </summary> 7 public static class XmlHelper 8 { 9 /// <summary> 10 ///

Json/XML序列化和反序列化

1.json序列化和反序列化 序列化是将对象状态转换为可保持或传输的格式的过程; 反序列化,它将流转换为对象; 1)Json.Net 推荐使用Json.Net类库,需要引入的命名空间; 序列化:JsonConvert.SerializeObject 反序列化:JsonConvert.DeserializeObject 2)使用JavaScriptSerializer类 使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dl

.NET XML序列化与反序列化

闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="className"></param> /// <returns></returns> public stat

Note4:XML序列化和反序列化

XML序列化和反序列化 待总结!