十五天精通WCF——第十二天 說說wcf中的那幾種序列化

一線碼農發表於2015-07-20

  

  我們都知道wcf是由通道棧組成的,在我們傳輸的引數走到傳輸通道層之前,先需要經過序列化的過程,也就是將引數序列化為message這篇

我們就來說說這裡的序列化,蠻有意思的,可能初學者也明白,在wcf中預設的序列化是DataContractSerializer,確實是這樣,不過wcf在通道中

其實不僅僅支援DataContractSerializer,它還支持其他型別的序列化,比如XmlSerializer,NetDataContractSerializer以及DataContractJson

Serializer,下面我們一起來見證下。

 

1. XmlSerializer

   要了解XmlSerializer,我們先來簡單看看NetDataContractSerializer,在前面的文章中,我也說過DataContract就是將我們的model序列化為

XSD,第二點就是使用DataContract的原則就是你必須在Model上加DataContract,而且在你要序列化的欄位上加DataMember這樣才能夠正確的序列

化,為了演示,我們先看看預設的序列化Model會變成啥樣?

 1     [DataContract]
 2     public class Student
 3     {
 4         [DataMember]
 5         public int ID { get; set; }
 6 
 7         [DataMember]
 8         public string Name { get; set; }
 9 
10         [DataMember]
11         public string SNS { get; set; }
12     }

但是在有些情況下,你可能並不適合用DataContract,比如Model是第三方提供的,那麼這個時候你的Model可能就不會有DataContract標記,那這樣

wcf就無法進行序列化,那我如果非要保證wcf能正常跑起來的話,還有其他好的辦法嗎???當然了,肯定有辦法,這就好比談戀愛一樣,總不能

在一棵樹上吊死吧,沒人誰離不開誰,也不會誰離開了誰會死,天涯何處無芳草,男兒何患無妻,對吧。Wcf中也一樣,既然DataContract用不了,自

然會有替代它的人,那這個人就是XmlSerializer,使用起來也很簡單,就是在契約方法上面加上XmlSerializerFormat即可,然後我們把Model

DataContract全部去掉。

 

是不是很簡單,下面我們就要驗證一下,看看這個Format是否進入到了這個Operation的Behavior中,

 

從上面的圖中,你也看到了, XmlSerializerFormat 已經被注入到Behavior中,並且是由類XmlSerializerOperationBehavior代為處理。

 

接下來,我們用fiddler監視一下,看看Message中的Body是否真的按照XmlSerializer 序列化了。

有沒有看到,這次Message的Body已經和文章開頭處的Message不一樣了。

 

2. NetDataContract

       這個玩意也沒什麼好說的,光從表面上看,它和DataContract唯一不同的地方就是多了一個Net,所以你大概也能猜到,這個功能大概和DataCont

ract一樣,只不過比DataContract多了一個程式集儲存,那這句話是什麼意思呢???就是NetDataContract會把程式集的名稱空間和類名都儲存到XSD中,

在反序列化的過程中必須要用同樣的程式集才能解開,其實不管我們是做SOA或者物件導向程式設計都講究介面編程,而NetDataContract給你的印象就是面

向物件程式設計,當然這也有好處,比如說如果把程式集帶進去就好像祕鑰一樣,必須有它才能解開,對吧,所以導致wcf專案組並不對NetDataContract感冒

,所以在實際應用上也不建議使用。

 

3. DataContractJsonSerializer

   看到上面這個帶有Json的字樣,我想大家都知道這玩意是幹什麼的???沒錯,他就是將我們的Model序列化成Json,這在wcfrest編碼使用的很廣,

如果大家有興趣的話,我在下一篇會詳細描述,這裡我們先簡單看一看。

 

好了,這一篇就說這些了,洗洗睡了。。。

 

相關文章