WCF序列化引擎具體應用技巧分享
WCF序列化的相關操作在實際應用中是一個非常重要的操作。我們將會在這篇文章中通過對WCF序列化引擎的相關介紹為大家詳細講解一下這方面的知識,希望能夠給朋友們帶來一些幫助。#t#
在缺省情況下,WCF 使用 DataContractSerializer 引擎對相關參數(shù)進行序列化,這也是 WCF 推薦的方式。另外一個選擇是 XmlSerializer,也就是 ASP.NET Web Service 所使用的序列化引擎。XmlSerializer 僅支持 DataContractSerializer 所支持的部分類型,但它允許你使用 XmlAttributeAttribute 等特性對序列化生成的 XML 進行更多的控制。
DataContractSerializer 支持的類型:
支持所有的基本類型,還包括 XmlElement 和 DateTime 這樣的常用類型。
支持使用 DataContractAttribute 標記的類型。
支持使用 SerializableAttribute 標記或者實現(xiàn) ISerializable 接口的類型。
WCF序列化引擎實現(xiàn) IXmlSerializable 接口的類型。
大多數(shù)集合(含泛型)類型,包括常用的 Array、List、IList 等。
通過向服務添加 XmlSerializerFormatAttribute 標記,就可以手動切換到 XmlSerializer 引擎。此時使用自定義類型,無須使用 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類型添加控制標記,看看 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序列化引擎的操作中,需要注意一個區(qū)別,我們 DataContractSerializer 和 DataContractAttribute 的時候,只有標記了 DataMemberAttribute 的成員被序列化,而 XmlSerializer 是序列化全部 "可視" 成員。