前言:
文章纯属是对于通过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 }
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 }
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
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
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 >
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。
转载于:https://www.cnblogs.com/xinggg22/archive/2009/11/26/1611004.html