數(shù)據(jù)契約(DataContract)
服務(wù)契約定義了遠(yuǎn)程訪問(wèn)對(duì)象和可供調(diào)用的方法,數(shù)據(jù)契約則是服務(wù)端和客戶端之間要傳送的自定義數(shù)據(jù)類型。
一旦聲明一個(gè)類型為DataContract,那么該類型就可以被序列化在服務(wù)端和客戶端之間傳送,如下所示。
[DataContract]
public class UserInfo
{
//….
}
只有聲明為DataContract的類型的對(duì)象可以被傳送,且只有成員屬性會(huì)被傳遞,成員方法不會(huì)被傳遞。WCF對(duì)聲明為DataContract的類型提供更加細(xì)節(jié)的控制,可以把一個(gè)成員排除在序列化范圍以外,也就是說(shuō),客戶端程序不會(huì)獲得被排除在外的成員的任何信息,包括定義和數(shù)據(jù)。默認(rèn)情況下,所有的成員屬性都被排除在外,因此需要把每一個(gè)要傳送的成員聲明為DataMember,如下所示。
[DataContract]
public class UserInfo
{
[DataMember]
public string UserName
{
get;
set;
}
[DataMember]
public int Age
{
get;
set;
}
[DataMember]
public string Location
{
get;
set;
}
public string Zodiac
{
get;
set;
}
}
上面這段代碼把UserInfo類聲明為DataContract,將UserName、Age、Location這3個(gè)屬性聲明為DataMember(數(shù)據(jù)成員)。Zodiac成員沒(méi)有被聲明為DataMember,因此在交換數(shù)據(jù)時(shí),不會(huì)傳輸Zodiac的任何信息。
DataContract也支持Name/Namespace屬性,如同ServiceContract,Name和Namespace可以自定義名稱和命名空間,客戶端將使用自定義的名稱和命名空間對(duì)DataContract類型進(jìn)行訪問(wèn)。
聲明為DataMember的成員也可以自定義客戶端可見(jiàn)的名稱,例如:
[DataMember(Name="Name")]
public string UserName
{
get;
set;
}
[DataMember(Name="Age")]
public int UserAge
{
get;
set;
}
除了Name和Namespace以外,DataMember還有以下參數(shù),它們的含義分別如下。
(1)IsRequired:值為true時(shí),要求序列化引擎檢查對(duì)象是否存在該值;若無(wú),則會(huì)有異常拋出。
(2)Order:bool類型值,值為true時(shí),序列化和反序列化過(guò)程將會(huì)按成員定義的順序進(jìn)行,這對(duì)依賴于成員位置的反序列化過(guò)程無(wú)比重要。
(3)EmitDefaultvalue:為成員屬性設(shè)置一個(gè)默認(rèn)值。