《WCF按部就班学习系列3_WCF数据契约概述》

 

本文的主要结构为:1)WCF数据契约的概述2)数据契约特性 3)实现代码分析及运行结果4)源码下载5)下一篇计划6)参考说明

 

(1)WCF数据契约的概述(What)

1.1数据契约是服务支持的契约职责的一部分,就像服务契约是组成契约的一部分一样。数据契约发布于服务元数据中,服务元数据允许客户端将与平台、技术无关的数据类型表示形式转换为客户端本地的表示形式。

1.2WCF3.5支持Json以后,提供了一种新序列化器:DataContractJsonSerializer.

  现在一共是4种:

  1.XmlSerializer 

  2.DataContratSerializer

  3.NetDataContractSerializer

  4.DataContractJsonSerializer

    在WCF服务编程中我们知道,服务契约定义了远程访问对象和可供调用的服务操作方法,数据契约则是定义服务端和客户端之间要传送的自定义数据类型。在WCF项目中,声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送。类只有声明为DataContract,该类型的对象才可以被传送,且只有类的属性会被传送,需要在属性生命前加DataMember声明,这样该属性就可以被序列化传送。默认情况属性是不可传递的。类的方法不会被传送。WCF对定义的数据契约的类型可以进行更加细节的控制,可以把一个成员属性排除在序列化范围以外,客户端程序不会获得被排除在外的成员属性的任何信息,包括定义和数据。

 

(2)数据契约特性

2.1为WCF提供新的面向服务特性,这些特性中的首要特性就是定义在System.Runtime.Serialization命名空间中的DataContractAttribute特性:

    [AttributeUsage(AttributeTargets.Enum  |

    AttributeTargets.Struct|

    AttributeTargets.Class,

    Inherited = false,

    AllowMultiple = false)]

    public sealed class DataContractAttribute : Attribute

    {

    public string Name

    {get;set;}

    public string Namespace

    {get;set;}

    }

2.2如果只是在类或结构类型上应用DataContract特性,WCF不会序列化类型的成员:

    [DataContract]

    struct Contact

    {

    //不会成为数据契约的一部分

    public string FirstName;

    public string LastName;

    }

2.3DataContract特性只能够做到将类型参与到数据契约中,以指示类型可以被按值编组(Marshal)。如果要序列化类型的成员,必须应用DataMemberAttribute特性。

  [AttributeUsage(AttributeTargets.Field|AttributeTargets.Property,

    Inherited = false,AllowMultiple = false)]

    public sealed class DataMemberAttribute : Attribute

    {

    public bool IsRequired

    {get;set;}

    public string Name

    {get;set;}

    public int Order

    {get;set;}

    }

2.4可以直接将DataMember特性应用到字段上:

    [DataContract]

    struct Contact

    {

    [DataMember]

    public string FirstName;

    [DataMember]

     public string LastName;

   }

或者应用到属性上(可以是显式属性,提供了属性的实现;也可以是自动属性,编译器自动生成内部成员以及访问实现):

   [DataContract]

   struct Contact

   {

    string m_FirstName;

    [DataMember]

    public string FirstName

    {

    get

    {

    return m_FirstName;

    }

    set

    {

    m_FirstName = value;

    }

    }

    [DataMember]

    public string LastName

    {get;set;}

   }

 

2.5与服务契约相似,数据成员或数据契约的访问限定与WCF之间并没有因果关系。数据契约的类型与成员均区分大小写。数据契约完全可以包含私有数据成员等内部类型:

   [DataContract]

   struct Contact

   {

    [DataMember]

    string m_FirstName;

    [DataMember]

    string m_LastName;

   }

 

(3)实现代码分析及运行结果

3.1WCFService服务器端代码如下:

 

3.2WCFHost宿主(托管进程)代码如下:

 

3.3WCFClient客户端代码如下:

 

(4)源码下载

http://download.csdn.net/source/3003843

(5)下一篇计划

下一篇主要介绍实例管理的相关知识。

(6)参考说明

1.《programming in WCF》

2.http://www.cnblogs.com/frank_xl/archive/2009/04/14/1433712.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值