本文的主要结构为: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.youkuaiyun.com/source/3003843
(5)下一篇计划
下一篇主要介绍实例管理的相关知识。
(6)参考说明
1.《programming in WCF》
2.http://www.cnblogs.com/frank_xl/archive/2009/04/14/1433712.html