解惑 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
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
测试用例1:
1
[Test]
2
public void Test1()
3
{
4
List<Person> list = new List<Person>();
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
XmlDocument doc = new XmlDocument();
16
doc.LoadXml(xml);
17![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
foreach (XmlNode node in doc.ChildNodes)
19
{
20
Console.WriteLine(node.InnerText);
21
}
22
Console.WriteLine(xml);
23
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这是一度啊很简单的代码,在控制台打印出序列化的结果为:
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这是符合xml格式的。
同样看另外一段测试,很简单的就直接吧DataContractSerializer替换为XmlSerializer:
1
[Test]
2
public void Test2()
3
{
4
List<Person> list = new List<Person>();
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
在控制台打印结果如下:
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>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
两个序列化得出的结果通过细心的比较会发现有几点不同:
第一,xml文件头。使用数据契约的是没有<?xml version="1.0" encoding="utf-8" ?>这一个标签的。
第二,命名空间。默认情况下两个的xml命名空间有很大的不同。
第三,格式化。数据契约输出的结果是未经格式的一串字符串(在我贴出的结果是经过手工格式化,方便阅读。),而xml序列化出的结果就已经格式化的xml。