1. 程式人生 > 實用技巧 >WCF初探-25:WCF中使用XmlSerializer類

WCF初探-25:WCF中使用XmlSerializer類

前言

  • 在上一篇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類示例

  • 解決方案如下:

  

  • 工程結構說明如下:
  1. 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();
        }
    }
}

  程式執行結果如下: