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

接着上一篇。

     在这个时候我们可以提出这样一个问题了:为什么两个序列器输出的结果会这样不一样呢?其实,它们两者没有什么可比性 的,DataContractSerializer 的出现并不是为了代替XmlSerializer,而是为了WCF提供一个高效的序列化工具,而且他只是序列化出XmlContent,也就是说它的结果 只有xml的内容部分,并且这些内容能够被 C#中操作xml各个类所识别的(详细参考:http://z.xiaoi.com/r?msdn.microsoft.com%2Fzh- cn%2Flibrary%2Fsystem.runtime.serialization.datacontractserializer.aspx)

   继续看下面一段代码。


代码
 1 [Test]
 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就会无法识别)。

   继续下面一段代码:

代码
 1 [Test]
 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"?>这一个标记。为什么?

posted on 2009-11-27 09:27  Jetson Lee  阅读(258)  评论(0编辑  收藏  举报

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