zoukankan      html  css  js  c++  java
  • 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 SDKsWindowsv7.0ABin下,我们可以通过命令行运行该工具生成客户端代理类

    • 在运行中输入cmd打开命令行,输入 cd C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin
    • 输入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();
            }
        }
    }

      程序运行结果如下:

      

  • 相关阅读:
    view如何被添加到window上并显示出来
    事件分发机制
    绘制机制
    setContentView
    消息机制——handler
    布局文件是如何被解析的?
    Xamarin.ios引用第三方SDK
    Xamarin.ios——First APP
    UITextView 文本垂直居中
    从NavigationController 下的UITableView中移除 header
  • 原文地址:https://www.cnblogs.com/wangweimutou/p/4511524.html
Copyright © 2011-2022 走看看