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

 前言:

         文章纯属是对于通过DataContractSerializer和XmlSerializer的对比而指出DataContractSerializer在序列化中的一些细节。如果存在错漏之处欢迎指出。

    我将会分3个篇幅通过代码的形式象大家展示心得。

         在MCF中,DataContractSerializer是默认的序列器。DataContractSerializer的使用也相对简单,WriteObject()和ReadObject()是它最主要的两个方法。

         但在实践过程中,我发现DataContractSerializer的序列化结果存在一点疑惑。

    首先定义一个测试用的对象Person:

 

 

 1  [DataContract]  
 2   public   class  Person  
 3 ExpandedBlockStart.gifContractedBlock.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.gifContractedBlock.gif         {
 4            List<Person> list = new List<Person>();
 5
 6ExpandedSubBlockStart.gifContractedSubBlock.gif            list.Add(new Person { ID = "1", FirstName = "Lee", LastName = "Jetson" });
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            list.Add(new Person { ID = "1", FirstName = "Chen", LastName = "Mc" });
 8ExpandedSubBlockStart.gifContractedSubBlock.gif            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)
19ExpandedSubBlockStart.gifContractedSubBlock.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.gifContractedBlock.gif         {
 4            List<Person> list = new List<Person>();
 5
 6ExpandedSubBlockStart.gifContractedSubBlock.gif            list.Add(new Person { ID = "1", FirstName = "Lee", LastName = "Jetson" });
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            list.Add(new Person { ID = "1", FirstName = "Chen", LastName = "Mc" });
 8ExpandedSubBlockStart.gifContractedSubBlock.gif            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 >

 

 

两个序列化得出的结果通过细心的比较会发现有几点不同:

第一,xml文件头。使用数据契约的是没有<?xml version="1.0" encoding="utf-8" ?>这一个标签的。

第二,命名空间。默认情况下两个的xml命名空间有很大的不同。

第三,格式化。数据契约输出的结果是未经格式的一串字符串(在我贴出的结果是经过手工格式化,方便阅读。),而xml序列化出的结果就已经格式化的xml。

 

转载于:https://www.cnblogs.com/xinggg22/archive/2009/11/26/1611004.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值