解惑 DataContractSerializer 数据契约序列器(1)

 前言:

         文章纯属是对于通过DataContractSerializer和XmlSerializer的对比而指出DataContractSerializer在序列化中的一些细节。如果存在错漏之处欢迎指出。

    我将会分3个篇幅通过代码的形式象大家展示心得。

         在MCF中,DataContractSerializer是默认的序列器。DataContractSerializer的使用也相对简单,WriteObject()和ReadObject()是它最主要的两个方法。

         但在实践过程中,我发现DataContractSerializer的序列化结果存在一点疑惑。

    首先定义一个测试用的对象Person:

 

 

 1 [DataContract]  
 2 public class Person  
 3 {  
 4     [DataMember]  
 5     public string ID;  
 6     [DataMember]  
 7     public string FirstName;  
 8     [DataMember]  
 9     public string LastName;  
10 }
 

 

测试用例1:
 1[Test]
 2        public void Test1()
 3        {
 4            List<Person> list = new List<Person>();
 5
 6            list.Add(new Person { ID = "1", FirstName = "Lee", LastName = "Jetson" });
 7            list.Add(new Person { ID = "1", FirstName = "Chen", LastName = "Mc" });
 8            list.Add(new Person { ID = "1", FirstName = "He", LastName = "James" });
 9
10            DataContractSerializer ser = new DataContractSerializer(typeof(List<Person>));
11            MemoryStream ms = new MemoryStream();
12            ser.WriteObject(ms, list);
13            string xml = Encoding.UTF8.GetString(ms.ToArray());
14
15            XmlDocument doc = new XmlDocument();
16            doc.LoadXml(xml);
17
18            foreach (XmlNode node in doc.ChildNodes)
19            {
20                Console.WriteLine(node.InnerText);
21            }

22            Console.WriteLine(xml);
23        }
 
这是一度啊很简单的代码,在控制台打印出序列化的结果为:
 1<ArrayOfPerson xmlns="http://schemas.datacontract.org/2004/07/Lzx.Test.Xml" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 2  <Person>
 3    <FirstName>Lee</FirstName>
 4    <ID>1</ID>
 5    <LastName>Jetson</LastName>
 6  </Person>
 7  <Person>
 8    <FirstName>Chen</FirstName>
 9    <ID>1</ID>
10    <LastName>Mc</LastName>
11  </Person>
12  <Person>
13    <FirstName>He</FirstName>
14    <ID>1</ID>
15    <LastName>James</LastName>
16  </Person>
17</ArrayOfPerson>
18
 

这是符合xml格式的。

同样看另外一段测试,很简单的就直接吧DataContractSerializer替换为XmlSerializer:

 1[Test]
 2        public void Test2()
 3        {
 4            List<Person> list = new List<Person>();
 5
 6            list.Add(new Person { ID = "1", FirstName = "Lee", LastName = "Jetson" });
 7            list.Add(new Person { ID = "1", FirstName = "Chen", LastName = "Mc" });
 8            list.Add(new Person { ID = "1", FirstName = "He", LastName = "James" });
 9
10            XmlSerializer ser = new XmlSerializer(typeof(List<Person>));
11            MemoryStream ms = new MemoryStream();
12            ser.Serialize(ms, list);
13            string xml = Encoding.UTF8.GetString(ms.ToArray());
14            Console.WriteLine(xml);
15        }

16

 

在控制台打印结果如下:

 

 1<?xml version="1.0"?>
 2<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3  <Person>
 4    <ID>1</ID>
 5    <FirstName>Lee</FirstName>
 6    <LastName>Jetson</LastName>
 7  </Person>
 8  <Person>
 9    <ID>1</ID>
10    <FirstName>Chen</FirstName>
11    <LastName>Mc</LastName>
12  </Person>
13  <Person>
14    <ID>1</ID>
15    <FirstName>He</FirstName>
16    <LastName>James</LastName>
17  </Person>
18</ArrayOfPerson>

 

 

两个序列化得出的结果通过细心的比较会发现有几点不同:

第一,xml文件头。使用数据契约的是没有<?xml version="1.0" encoding="utf-8" ?>这一个标签的。

第二,命名空间。默认情况下两个的xml命名空间有很大的不同。

第三,格式化。数据契约输出的结果是未经格式的一串字符串(在我贴出的结果是经过手工格式化,方便阅读。),而xml序列化出的结果就已经格式化的xml。

 

posted on 2009-11-26 08:49  Jetson Lee  阅读(444)  评论(0编辑  收藏  举报

中山房地产信息网    中山楼盘   中山二手房