WCF序列化引擎具體應(yīng)用技巧分享
WCF序列化的相關(guān)操作在實(shí)際應(yīng)用中是一個(gè)非常重要的操作。我們將會(huì)在這篇文章中通過對(duì)WCF序列化引擎的相關(guān)介紹為大家詳細(xì)講解一下這方面的知識(shí),希望能夠給朋友們帶來(lái)一些幫助。#t#
在缺省情況下,WCF 使用 DataContractSerializer 引擎對(duì)相關(guān)參數(shù)進(jìn)行序列化,這也是 WCF 推薦的方式。另外一個(gè)選擇是 XmlSerializer,也就是 ASP.NET Web Service 所使用的序列化引擎。XmlSerializer 僅支持 DataContractSerializer 所支持的部分類型,但它允許你使用 XmlAttributeAttribute 等特性對(duì)序列化生成的 XML 進(jìn)行更多的控制。
DataContractSerializer 支持的類型:
支持所有的基本類型,還包括 XmlElement 和 DateTime 這樣的常用類型。
支持使用 DataContractAttribute 標(biāo)記的類型。
支持使用 SerializableAttribute 標(biāo)記或者實(shí)現(xiàn) ISerializable 接口的類型。
WCF序列化引擎實(shí)現(xiàn) IXmlSerializable 接口的類型。
大多數(shù)集合(含泛型)類型,包括常用的 Array、List、IList 等。
通過向服務(wù)添加 XmlSerializerFormatAttribute 標(biāo)記,就可以手動(dòng)切換到 XmlSerializer 引擎。此時(shí)使用自定義類型,無(wú)須使用 SerializableAttribute、ISerializable、DataContractAttribute 等特性或接口。
- public class Data
- {
- public int I = 1234;
- public string X = "Hello, World!";
- }
- [ServiceContract, XmlSerializerFormat]
- public interface IContract
- {
- [OperationContract]
- void Test(Data d);
- }
- public class MyService : IContract
- {
- public void Test(Data d)
- {
- Console.WriteLine("i={0}; x={1}", d.I, d.X);
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- AppDomain.CreateDomain("Server").DoCallBack(delegate
- {
- ServiceHost host = new ServiceHost(typeof(MyService));
- host.AddServiceEndpoint(typeof(IContract), new BasicHttpBinding(),
- "http://localhost:8080/myservice");
- host.Open();
- });
- ChannelFactory< IContract> factory = new ChannelFactory< IContract>
(new BasicHttpBinding(),- "http://localhost:8080/myservice");
- IContract client = factory.CreateChannel();
- Data d = new Data();
- d.I = 123456;
- d.X = "China";
- client.Test(d);
- }
- }
我們?yōu)樽远x類型添加控制標(biāo)記,看看 Request Message 的變化。
- public class Data
- {
- [System.Xml.Serialization.XmlAttribute]
- public int I = 1234;
- [System.Xml.Serialization.XmlElement]
- public string X = "Hello, World!";
- }
- Request Message
- < MessageLogTraceRecord>
- < s:Envelope xmlns:s="http://.../">
- < s:Header>
- < Action s:mustUnderstand="1" xmlns="http://...">
http://tempuri.org/IContract/Test< /Action>- < /s:Header>
- < s:Body xmlns:xsi="http://..." xmlns:xsd="http://...">
- < Test xmlns="http://tempuri.org/">
- < d I="123456">
- < X>China< /X>
- < /d>
- < /Test>
- < /s:Body>
- < /s:Envelope>
- < /MessageLogTraceRecord>
在WCF序列化引擎的操作中,需要注意一個(gè)區(qū)別,我們 DataContractSerializer 和 DataContractAttribute 的時(shí)候,只有標(biāo)記了 DataMemberAttribute 的成員被序列化,而 XmlSerializer 是序列化全部 "可視" 成員。