客戶(hù)端和服務(wù)之間要能夠進(jìn)行成功的通訊,并不一定要求通訊的雙方都具有相同的類(lèi)型,只需要通訊雙方的類(lèi)型具有等價(jià)的數(shù)據(jù)契約就可以了。如果Data Contract滿(mǎn)足以下條件,我們說(shuō)它們是等價(jià)的:
1 具有相同的名稱(chēng)和命名空間 你可以通過(guò)DataContractAttribute的Name和Namespace屬性指定(注意其值是大小寫(xiě)敏感的)。缺省的命名空間是:http://schemas.datacontract.org/2004/07/Clr.Namespace。(你也可以通過(guò)ContractNamespaceAttribute來(lái)為不包含delegate聲明的整個(gè)模塊或Assembly中的所有數(shù)據(jù)契約來(lái)修改此缺省值。)一般情況下缺省的數(shù)據(jù)契約名稱(chēng)是類(lèi)型的名稱(chēng),但如果是泛型類(lèi)型的話,缺省的數(shù)據(jù)契約名稱(chēng)是由以下四部分依次連接組成: 1 泛型類(lèi)型名稱(chēng)
2 Of
3泛型類(lèi)型參數(shù)的數(shù)據(jù)契約名稱(chēng)(如果是多個(gè)參數(shù)就按參數(shù)順序依次連接)
4 根據(jù)泛型參數(shù)的數(shù)據(jù)契約的命名空間計(jì)算出來(lái)的哈希值(如果泛型參數(shù)全部是基本類(lèi)型的話,此部分忽略)。
如果通過(guò)DataContractAttribute的Name屬性來(lái)為泛型類(lèi)型指定數(shù)據(jù)契約名稱(chēng)時(shí),你可以在Name屬性值中使用{0}來(lái)指定泛型的第一個(gè)參數(shù)的數(shù)據(jù)契約名稱(chēng),{1}就是第二個(gè)泛型參數(shù)的,依次類(lèi)推。{#}表示通過(guò)泛型參數(shù)的數(shù)據(jù)契約命名空間計(jì)算出來(lái)的哈希值。(注:必須要有{}哦)
2 包含相同的數(shù)據(jù)契約成員(注意其值是大小寫(xiě)敏感的) 數(shù)據(jù)契約成員缺省的名稱(chēng)是類(lèi)型的字段或?qū)傩缘拿Q(chēng)。你可以通過(guò)DataMemberAttribute的Name屬性來(lái)設(shè)置成你所希望的值。
3 數(shù)據(jù)契約成員的順序必須相同 數(shù)據(jù)契約成員的順序按照以下規(guī)則進(jìn)行依次排序:
1 基類(lèi)數(shù)據(jù)契約成員
2 DataMemberAttribute中不含Order屬性的成員,根據(jù)數(shù)據(jù)契約成員的名稱(chēng)按照字母排序
3 DataMemberAttribute中含有Order屬性的成員,先按照Order的順序排序,如果Order的屬性值相同的根據(jù)數(shù)據(jù)契約成員的名稱(chēng)按照字母排序
|