資料契約(DataContract)

2021-07-02 05:10:55 字數 1892 閱讀 3711

服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。

一旦宣告乙個型別為datacontract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,如下所示。

[datacontract]

public class userinfo

只有宣告為datacontract的型別的物件可以被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。wcf對宣告為datacontract的型別提供更加細節的控制,可以把乙個成員排除在序列化範圍以外,也就是說,客戶端程式不會獲得被排除在外的成員的任何資訊,包括定義和資料。預設情況下,所有的成員屬性都被排除在外,因此需要把每乙個要傳送的成員宣告為datamember,如下所示。

[datacontract]

public class userinfo

[datamember]

public int age

[datamember]

public string location

public string zodiac

}上面這段**把userinfo類宣告為datacontract,將username、age、location這3個屬性宣告為datamember(資料成員)。zodiac成員沒有被宣告為datamember,因此在交換資料時,不會傳輸zodiac的任何資訊。

datacontract也支援name/namespace屬性,如同servicecontract,name和namespace可以自定義名稱和命名空間,客戶端將使用自定義的名稱和命名空間對datacontract型別進行訪問。

宣告為datamember的成員也可以自定義客戶端可見的名稱,例如:

[datamember(name="name")]

public string username

[datamember(name="age")]

public int userage

除了name和namespace以外,datamember還有以下引數,它們的含義分別如下。

(1)isrequired:值為true時,要求序列化引擎檢查物件是否存在該值;若無,則會有異常丟擲。

(2)order:bool型別值,值為true時,序列化和反序列化過程將會按成員定義的順序進行,這對依賴於成員位置的反序列化過程無比重要。

(3)emitdefaultvalue:為成員屬性設定乙個預設值。

一般情況下,將型別宣告為datacontract就可以滿足傳送的需求了,不過特殊情況是難以避免的,這時就需要對要傳送的soap訊息進行更加精確的控制,messagecontract可以滿足這種需求。

把乙個型別宣告為messagecontract,意味著它可以被序列化為soap訊息,可以宣告型別的成員為soap訊息的各個部分,如header、body等,如下所示。

[messagecontract]

public class usermessage

set

}[messageheader(

name = "authkey",

namespace = "",

mustunderstand = true

)]public string authkey

set }}

user成員被宣告為messagebody(訊息體)的乙個成員,authkey被宣告為訊息頭(messageheader)的乙個成員。這個類將可以生成如下的soap訊息。

messageheader中,mustunderstand引數表示讀取該頭的程式必須能夠識別頭的內容,否則不能繼續處理。name/namespace的作用與前面的元素相同。另有relay引數,若為true,頭的內容被接收到以後會在響應訊息中回發給訊息傳送端。

WCF中的資料契約(DataContract)

服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。一旦宣告乙個型別為datacontract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,如下所示。datacontract public class userinfo 只有宣告為datacontr...

wcf資料契約

專案中需要使用繼承關係,乙個函式返回特定的子類,在序列化的時候需要告訴序列化器,在父類檔案中使用kowntype注釋即可。namespace healthadminwebservice.logic datamember public string exercisestep datamember pu...

談WCF資料契約疑問之共享資料契約

最近在做專案的時候,發現同乙個資料契約再客戶端隸屬於兩個不同的命名空間,為此如果兩個服務進行互動的時候會涉及到型別 的問題,互操作性很差,要進行不必要的拆和裝,在前面終於讓我找到了答案,下面我來描述一下這個場景,大家請看下面 實體類 大家請注意命名空間 using system using syst...