前言:
文章纯属是对于通过DataContractSerializer和XmlSerializer的对比而指出DataContractSerializer在序列化中的一些细节。如果存在错漏之处欢迎指出。
我将会分3个篇幅通过代码的形式象大家展示心得。
在MCF中,DataContractSerializer是默认的序列器。DataContractSerializer的使用也相对简单,WriteObject()和ReadObject()是它最主要的两个方法。
但在实践过程中,我发现DataContractSerializer的序列化结果存在一点疑惑。
首先定义一个测试用的对象Person:
1
[DataContract]
2
public
class
Person
3
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
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
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
4
List<Person> list = new List<Person>();
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
list.Add(new Person
{ ID = "1", FirstName = "Lee", LastName = "Jetson" });
7![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
list.Add(new Person
{ ID = "1", FirstName = "Chen", LastName = "Mc" });
8![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
4
List<Person> list = new List<Person>();
5![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
list.Add(new Person
{ ID = "1", FirstName = "Lee", LastName = "Jetson" });
7![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
list.Add(new Person
{ ID = "1", FirstName = "Chen", LastName = "Mc" });
8![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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
在控制台打印结果如下:
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。