日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF序列化各種方式詳解

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

錫山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

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

先來看看兩者的聲明:

 
 
 
  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)的實現(xiàn)繼承自基類XmlObjectSerializer,其他方法均為已覆寫或?qū)崿F(xiàn)。 #t#

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

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

現(xiàn)在,再來看看此二者的最大關(guān)鍵區(qū)別吧!從一個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 = id; this.Name = name;   
  12. }} 

以上是一個再簡單不過的DataContract的,把他給序列化看看出來些啥。

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

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


標(biāo)題名稱:WCF序列化各種方式詳解
網(wǎng)站鏈接:http://m.5511xx.com/article/codhgpc.html