成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF序列化基本概念詳談

開發 開發工具
WCF序列化中有兩種內置的序列化,分別為DataContractSerializer和NetDataContractSerializer。希望大家可以透過這篇文章充分掌握這一知識點。

WCF框架在開發人員眼中是一個非常實用的開發工具。它可以幫助我們實現跨平臺的解決方案。在這篇文章中,我們可以了解到有關WCF序列化的一些概念。#t#

大家知道,WCF內置了兩種WCF序列化,DataContractSerializer和NetDataContractSerializer。WCF序列化的基本概念Artech兄已經說得很清楚了,在此不再贅述,本文僅就此二者的區別作一番探討。

先來看看兩者的聲明:

  1. public sealed class DataContractSerializer : 
    XmlObjectSerializer{ public 
    DataContractSerializer(Type type);
  2.  … public override object ReadObject
    (XmlReader reader); 
  3. public object ReadObject(Stream stream);
  4.  public void WriteObject(Stream 
    stream, object graph);
  5.  public override void WriteObject
    (XmlWriter writer, object graph); … }  

 

  1. public sealed class NetDataContractSerializer
     : XmlObjectSerializer, IFormatter
    { public NetDataContractSerializer();
  2.  … public object Deserialize(Stream stream); 
  3. public void Serialize(Stream stream, object graph);
  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); …} 

其中兩者的ReadObject(Straem)、WriteObject(Stream, object)的實現繼承自基類XmlObjectSerializer,其他方法均為已覆寫或實現。

從兩個類型的聲明中可以看出NetDataContractSerializer實現了IFormatter接口,而DataContractSerializer沒有,因此只有NetDataContractSerializer能使用.NET基礎結構中的WCF序列化,而DataContractSerializer則是專用于WCF的。

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

 

現在,再來看看此二者的***關鍵區別吧!從一個示例開始吧:

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

 

以上是一個再簡單不過的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); 

 

執行完以上代碼后,str的值為:

 

 

 

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

 

恩,此SOAP消息那是相當得正常。然后將同一個對象用NetDataContractSerializer序列化:

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

觀察一下nstr的值:

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

 

發現了嗎?撇開xml命名空間不說,Sub元素多了Type,Assembly和Id,Name屬性也多了個Id。信息完整多了~~,現在就可以解釋兩者Constructor的區別了,DataContractSerializer是按照SOA的datacontract協議(與SOAP基本一直)來序列化對象的,它并不包含平臺相關的信息,比如類型,程序集等。

所以比如在創建WCF序列化時就提供將要序列化和反系列化的類型信息,DataContractSerializer無法工作。而NetDataContractSerializer則大大擴充了SOAP,為它添加了程序集、類型名等附加信息,這樣一來,序列化器可以完全由序列化的內容來準確推斷將要構造的對象,而不必依賴Constructor所提供的類型參數了。這就是兩者Constructor不同的原因。

責任編輯:曹凱 來源: 博客園
相關推薦

2009-12-21 10:27:52

WCF基本概念

2010-02-23 16:32:29

WCF服務

2010-02-24 17:17:04

WCF宿主環境

2010-03-02 13:14:38

WCF MSMQ隊列

2010-03-01 16:25:07

WCF體系架構

2009-12-21 15:33:07

WCF集合元素

2010-03-01 14:50:30

WCF行為類型

2010-03-01 18:04:35

WCF配置綁定

2010-02-25 14:46:31

2010-03-02 11:10:43

WCF標準終結點

2009-12-21 14:37:14

2010-03-01 16:41:04

WCF數據表

2010-03-02 16:22:31

WCF狀態應用

2009-12-22 10:16:54

WCF服務狀態

2009-11-09 15:06:34

WCF序列化

2010-03-01 17:57:11

WCF緩存機制

2009-11-05 16:34:37

WCF序列化

2009-12-22 14:31:27

WCF序列化依賴屬性

2010-02-22 16:00:22

WCF序列化

2010-02-23 13:03:34

WCF序列化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品免费在线 | 紧缚调教一区二区三区视频 | 黄色在线免费播放 | 亚洲一二三区精品 | 午夜视频一区二区三区 | 黄色片亚洲 | 国产午夜精品一区二区三区四区 | 国产高清精品在线 | 日本免费一区二区三区视频 | 久久精品国产一区二区 | 成人激情视频免费在线观看 | 一区二区三区国产精品 | 国产精品99久久久精品免费观看 | 欧美黄色网 | 精品一区二区三区视频在线观看 | 99国产精品一区二区三区 | 国产精品一区一区三区 | 久久久成人精品 | 欧美成人a | 日日操夜夜操天天操 | 国产欧美一区二区三区在线看 | 精品久久久久久久久久久久久久 | 国内91在线| 成年人视频在线免费观看 | 久久影院一区 | 日韩在线观看中文字幕 | 久久久久99 | 美日韩精品 | 国产精品永久免费视频 | 免费三级黄 | 精品一区二区三区不卡 | 亚洲二区在线 | 888久久久 | 亚洲精品在线视频 | 碰碰视频 | 色综合一区二区 | 日韩中文字幕一区 | 91看片网 | 欧美黄 片免费观看 | 亚洲日日操 | 国产精品视频 |