WCF初探-25:WCF中使用XmlSerializer類
阿新 • • 發佈:2020-07-15
前言
- 在上一篇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(); } } } }View Code
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>View Code
我們通過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(); } } }
程式執行結果如下: