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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
WCF序列化基本概念詳談

WCF框架在開(kāi)發(fā)人員眼中是一個(gè)非常實(shí)用的開(kāi)發(fā)工具。它可以幫助我們實(shí)現(xiàn)跨平臺(tái)的解決方案。在這篇文章中,我們可以了解到有關(guān)WCF序列化的一些概念。#t#

我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、阿拉善盟ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的阿拉善盟網(wǎng)站制作公司

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

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

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

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

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

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

 
 
 
  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 = id; this.Name = name; }}

以上是一個(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
  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消息那是相當(dāng)?shù)谜?。然后將同一個(gè)對(duì)象用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> 

發(fā)現(xiàn)了嗎?撇開(kāi)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)的信息,比如類(lèi)型,程序集等。

所以比如在創(chuàng)建WCF序列化時(shí)就提供將要序列化和反系列化的類(lèi)型信息,DataContractSerializer無(wú)法工作。而NetDataContractSerializer則大大擴(kuò)充了SOAP,為它添加了程序集、類(lèi)型名等附加信息,這樣一來(lái),序列化器可以完全由序列化的內(nèi)容來(lái)準(zhǔn)確推斷將要構(gòu)造的對(duì)象,而不必依賴Constructor所提供的類(lèi)型參數(shù)了。這就是兩者Constructor不同的原因。


網(wǎng)站題目:WCF序列化基本概念詳談
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/ccsispo.html