在这个时候我们可以提出这样一个问题了:为什么两个序列器输出的结果会这样不一样呢?其实,它们两者没有什么可比性 的,DataContractSerializer 的出现并不是为了代替XmlSerializer,而是为了WCF提供一个高效的序列化工具,而且他只是序列化出XmlContent,也就是说它的结果 只有xml的内容部分,并且这些内容能够被 C#中操作xml各个类所识别的(详细参考:http://z.xiaoi.com/r?msdn.microsoft.com%2Fzh- cn%2Flibrary%2Fsystem.runtime.serialization.datacontractserializer.aspx)
继续看下面一段代码。
2 public void Test3()
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 var ser = new DataContractSerializer(typeof(List<Person>));
11 var ms = new MemoryStream();
12 var writer = XmlDictionaryWriter.CreateTextWriter(ms);
13 ser.WriteObject(writer, list);
14 writer.Close();
15 string xml = Encoding.UTF8.GetString(ms.ToArray());
16 Console.WriteLine(xml);
17 }
输出结果同样是没有 <?xml version="1.0" encoding="utf-8"?>这一个标记。在微软官方的说法是XmlDictionaryWriter是经过优化的xmlwriter,究竟优化是原理这里就不做讨论了。
到这里,会有一个疑问:DataContractSerializer 序列器不是可以序列化出所要的内容吗,而且能被作为xm源在程序中读出?这样一想好像也是。不过有些时候我们的应用程序不一定只用c#语言编写,可能前台 是javascript或flex的话这样的输出结果就没办法操作了(例如,flex通过请求得出xml就会无法识别)。
继续下面一段代码:
2 public void Test4()
3 {
4 List<Person> list = new List<Person>();
5 list.Add(new Person { ID = "1", FirstName = "Lee", LastName = "Jetson" });
6 list.Add(new Person { ID = "1", FirstName = "Chen", LastName = "Mc" });
7 list.Add(new Person { ID = "1", FirstName = "He", LastName = "James" });
8
9 DataContractSerializer ser = new DataContractSerializer(typeof(List<Person>));
10 MemoryStream ms = new MemoryStream();
11 XmlWriter writer = XmlWriter.Create(ms);
12
13 ser.WriteObject(writer, list);
14 writer.Flush();
15 writer.Close();
16 string xml = Encoding.UTF8.GetString(ms.ToArray());
17 Console.WriteLine(xml);
18 }
粗劣一看和Test4好像一样的,其实唯一的不同就是这里用的是XmlWriter 来写xml。输出结果竟然就会有<?xml version="1.0" encoding="utf-8"?>这一个标记。为什么?