自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

WCF序列化各種方式詳解

開發(fā) 開發(fā)工具
WCF序列化其實(shí)可以分為兩種方式,一種為DataContractSerializer,而另一種則為NetDataContractSerializer。

WCF是一款由微軟公司開發(fā)的一款功能強(qiáng)大的工具,可以為開發(fā)人員輕松的創(chuàng)建一個(gè)安全性較高的解決方案。在這里我們就先為大家詳細(xì)介紹一下有關(guān)WCF序列化的相關(guān)概念,希望能給大家?guī)?lái)一些幫助。

大家知道,WCF內(nèi)置了兩種序列化方式,DataContractSerializer和NetDataContractSerializer。WCF序列化的基本概念A(yù)rtech兄已經(jīng)說(shuō)得很清楚了,在此不再贅述,本文僅就此二者的區(qū)別作一番探討。

先來(lái)看看兩者的聲明:

  1. public sealed class DataContractSerializer : XmlObjectSerializer  
  2. {   
  3. public DataContractSerializer(Type type);   
  4. … public override object ReadObject(XmlReader reader);  
  5. public object ReadObject(Stream stream);   
  6. public void WriteObject(Stream stream, object graph);  
  7. public override void WriteObject(XmlWriter writer, object graph); …   
  8. }   
  9. public sealed class NetDataContractSerializer : 
    XmlObjectSerializer, IFormatter  
  10. {  
  11. public NetDataContractSerializer();   
  12. … public object Deserialize(Stream stream);   
  13. public void Serialize(Stream stream, object graph);  
  14. public override object ReadObject(XmlReader reader);  
  15. public object ReadObject(Stream stream);   
  16. public void WriteObject(Stream stream, object graph);  
  17. public override void WriteObject(XmlWriter writer, object graph);   
  18. …} 

其中兩者的ReadObject(Straem)、WriteObject(Stream, object)的實(shí)現(xiàn)繼承自基類XmlObjectSerializer,其他方法均為已覆寫或?qū)崿F(xiàn)。 #t#

從兩個(gè)類型的聲明中可以看出NetDataContractSerializer實(shí)現(xiàn)了IFormatter接口,而DataContractSerializer沒有,因此只有NetDataContractSerializer能使用.NET基礎(chǔ)結(jié)構(gòu)中的序列化,而DataContractSerializer則是專用于WCF的。

還有一個(gè)細(xì)節(jié)DataContractSerializer的Constructor有一個(gè)Type類型的參數(shù),而NetDataContractSerializer沒有。這可蘊(yùn)藏著深意啊,讀者接著看就明白了。

 

現(xiàn)在,再來(lái)看看此二者的最大關(guān)鍵區(qū)別吧!從一個(gè)WCF序列化示例開始吧:

  1. [DataContract]  
  2. public class Sub   
  3. {   
  4. // Fields [DataMember]   
  5. public int Id;   
  6. [DataMember]   
  7. public string Name;   
  8. // Methods   
  9. public Sub() {}   
  10. public Sub(int id, string name) {   
  11. this.Id = idthis.Name = name;   
  12. }} 

以上是一個(gè)再簡(jiǎn)單不過(guò)的DataContract的,把他給序列化看看出來(lái)些啥。

 

先用DataContractSerializer序列化:

 

 

  1. Sub sub = new Sub(9, "nine");  
  2. DataContractSerializer dcs = new DataContractSerializer(typeof(Sub));  
  3. MemoryStream stream = new MemoryStream();  
  4. dcs.WriteObject(stream, sub);  
  5. byte[] buf = stream.ToArray();  
  6. string str = Encoding.UTF8.GetString(buf, 0, buf.Length); 

 

執(zhí)行完以上代碼后,str的值為:

 

 

 

  1. < Sub xmlns="http://schemas.datacontract.org/2004/07/
    ServiceInterface"
     xmlns:i="http://www.w3.org/2001/
    XMLSchema-instance"
    >   
  2. < Id>10< /Id>   
  3. < Name>nine< /Name>   
  4. < /Sub> 

 

恩,此SOAP消息那是相當(dāng)?shù)谜?。然后將同一個(gè)對(duì)象用NetDataContractSerializer序列化:

  1. NetDataContractSerializer ndcs = new NetDataContractSerializer();  
  2. MemoryStream nstream = new MemoryStream();  
  3. ndcs.WriteObject(nstream, sub);  
  4. byte[] nbuf = nstream.ToArray();  
  5. string nstr = Encoding.UTF8.GetString(nbuf, 0, nbuf.Length); 

 

觀察一下nstr的值:

  1. < Sub z:Id="1" z:Type="ServiceInterface.Sub" z:Assembly=
    "ServiceInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
    xmlns="http://schemas.datacontract.org/2004/07/ServiceInterface" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">   
  2. < Id>10< /Id>   
  3. < Name z:Id="2">nine< /Name>   
  4. < /Sub> 

 

發(fā)現(xiàn)了嗎?撇開xml命名空間不說(shuō),Sub元素多了Type,Assembly和Id,Name屬性也多了個(gè)Id。信息完整多了~~,現(xiàn)在就可以解釋兩者Constructor的區(qū)別了,DataContractSerializer是按照SOA的datacontract協(xié)議(與SOAP基本一直)來(lái)序列化對(duì)象的,它并不包含平臺(tái)相關(guān)的信息,比如類型,程序集等。所以比如在創(chuàng)建序列化器時(shí)就提供將要序列化和反系列化的類型信息,DataContractSerializer無(wú)法工作。而NetDataContractSerializer則大大擴(kuò)充了SOAP,為它添加了程序集、類型名等附加信息,這樣一來(lái),序列化器可以完全由序列化的內(nèi)容來(lái)準(zhǔn)確推斷將要構(gòu)造的對(duì)象,而不必依賴Constructor所提供的類型參數(shù)了。這就是兩者Constructor不同的原因。

以上就是對(duì)WCF序列化的相關(guān)介紹。

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2010-02-24 12:41:58

WCF異常處理

2009-11-09 15:06:34

WCF序列化

2009-11-05 16:34:37

WCF序列化

2009-08-06 11:16:25

C#序列化和反序列化

2010-02-23 13:03:34

WCF序列化

2009-12-22 14:31:27

WCF序列化依賴屬性

2009-12-21 16:52:02

WCF序列化

2010-02-24 17:07:26

WCF序列化引擎

2009-09-09 15:47:27

XML序列化和反序列化

2009-11-05 14:25:36

WCF Data Co

2016-12-20 14:55:52

JavaScript鏈?zhǔn)?/a>結(jié)構(gòu)序列

2009-08-19 10:13:22

Remoting序列化

2016-09-21 00:15:27

2022-08-06 08:41:18

序列化反序列化Hessian

2024-05-06 00:00:00

C#序列化技術(shù)

2021-08-30 12:25:12

Python序列化函數(shù)

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2010-02-24 17:41:05

WCF集合反序列化

2023-12-13 13:49:52

Python序列化模塊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)