前言
- 在上一篇WCF序列化和反序列化中,文章介紹了WCF序列化和反序列化的機制,雖然WCF針對序列化提供了默認的DataContractSerializer序列化引擎,但是WCF還支持其他的序列化引擎,那就是XmlSerializer序列化引擎。本文將詳細介紹XmlSerializer類在WCF中具體的使用方式。
XmlSerializer類概述
- XmlSerializer 類不是 WCF 的專用類。ASP.NET Web 服務同樣使用該類作為序列化引擎。
- XmlSerializer 類支持的類型少於 DataContractSerializer 類支持的類型,但它允許對生成的 XML 進行更多的控制,並且支持更多的 XML 架構定義語言 (XSD) 標准。
- 使用XmlSerializer類時,數據成員采用XmlAttribute修飾,並且XmlSerializer序列化引擎不支持數據協定類型。
使用XmlSerializer類時的注意事項
- 在序列化數據協定類型時,DataContractSerializer 類只序列化用 DataMemberAttribute 屬性標記的成員。XmlSerializer類序列化任何公共成員。
- 雖然ataContractSerializer 類為默認值,您也可以通過將 XmlSerializerFormat屬性應用於服務協定類型來為您的服務顯式選擇此類。
- 不能直接將與兼容 XmlSerializer 的屬性應用於協定操作參數或返回值。但是,可將這些屬性應用於類型化消息(消息協定正文部分)。
使用XmlSerializer類示例
- 解決方案如下:
- 工程結構說明如下:
- Service:類庫程序,WCF服務端應用程序,服務協定采用XmlSerializerFormat進行修飾,說明此協定采用XmlSerializer序列化引擎。User類型成員采用XmlAttribute進行修飾。IUserInfo.cs代碼如下:
using System.Xml.Serialization; using System.ServiceModel; namespace Service { [ServiceContract,XmlSerializerFormat] public interface IUserInfo { [OperationContract] User[] GetInfo(); } public class User { [XmlAttribute] public int ID { get; set; } [XmlAttribute] public string Name { get; set; } [XmlAttribute] public int Age { get; set; } [XmlAttribute] public string Nationality { get; set; } } }
UserInfo.cs代碼如下:
using System.Collections.Generic; namespace Service { public class UserInfo:IUserInfo { public User[] GetInfo() { List<User> Users = new List<User>(); Users.Add(new User { ID = 1, Name = "JACK", Age = 20, Nationality = "CHINA" }); Users.Add(new User { ID = 2, Name = "TOM", Age = 18, Nationality = "JAPAN" }); Users.Add(new User { ID = 3, Name = "SMITH", Age = 22, Nationality = "KOREA" }); Users.Add(new User { ID = 4, Name = "ALENCE", Age = 21, Nationality = "INDIA" }); Users.Add(new User { ID = 5, Name = "JOHN", Age = 22, Nationality = "SINGAPORE" }); return Users.ToArray(); } } }
2. Host:控制台應用程序,服務承載程序。添加對程序集Service的引用,完成以下代碼,寄宿服務。Program.cs代碼如下:

using System; using Service; using System.ServiceModel; namespace Host { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(UserInfo))) { host.Opened += delegate { Console.WriteLine("服務已經啟動,按任意鍵終止!"); }; host.Open(); Console.Read(); } } } }
App.config代碼如下:

<?xml version="1.0"?> <configuration> <system.serviceModel> <services> <service name="Service.UserInfo" behaviorConfiguration="mexBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:1234/UserInfo/"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="Service.IUserInfo" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="mexBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
我們通過svcutil.exe工具生成客戶端代理類和客戶端的配置文件
svcutil.exe是一個命令行工具,位於路徑C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin下,我們可以通過命令行運行該工具生成客戶端代理類
- 在運行中輸入cmd打開命令行,輸入 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
- 輸入svcutil.exe /out:f:\UserInfoClient.cs /config:f:\App.config http://localhost:1234/UserInfo
3. Client:控制台應用程序,客戶端調用程序。將生成的UserInfoClient.cs和App.config復制到Client的工程目錄下,完成客戶端調用代碼。Program.cs的代碼如下:
using System; namespace Client { class Program { static void Main(string[] args) { UserInfoClient proxy = new UserInfoClient(); User[] Users = proxy.GetInfo(); Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}", "ID", "Name", "Age", "Nationality"); for (int i = 0; i < Users.Length; i++) { Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}", Users[i].ID.ToString(), Users[i].Name.ToString(), Users[i].Age.ToString(), Users[i].Nationality.ToString()); } Console.Read(); } } }
程序運行結果如下: