WCF序列化的相关操作在实际应用中是一个非常重要的操作。我们将会在这篇文章中通过对WCF序列化引擎的相关介绍为大家详细讲解一下这方面的知识,希望能够给朋友们带来一些帮助。#t#
在缺省情况下,WCF 使用 DataContractSerializer 引擎对相关参数进行序列化,这也是 WCF 推荐的方式。另外一个选择是 XmlSerializer,也就是 ASP.NET Web Service 所使用的序列化引擎。XmlSerializer 仅支持 DataContractSerializer 所支持的部分类型,但它允许你使用 XmlAttributeAttribute 等特性对序列化生成的 XML 进行更多的控制。
DataContractSerializer 支持的类型:
支持所有的基本类型,还包括 XmlElement 和 DateTime 这样的常用类型。
支持使用 DataContractAttribute 标记的类型。
支持使用 SerializableAttribute 标记或者实现 ISerializable 接口的类型。
WCF序列化引擎实现 IXmlSerializable 接口的类型。
大多数集合(含泛型)类型,包括常用的 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);
- }
- }
我们为自定义类型添加控制标记,看看 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序列化引擎的操作中,需要注意一个区别,我们 DataContractSerializer 和 DataContractAttribute 的时候,只有标记了 DataMemberAttribute 的成员被序列化,而 XmlSerializer 是序列化全部 "可视" 成员。