WCF 省略DataContract標記

2021-07-14 08:14:51 字數 3392 閱讀 2653

寫過

wcf程式的朋友都知道,在對實體物件在

wcf和客戶端之間傳遞時一定要加

datacontract

標記這個類並用

datamember

來標記要序列化的屬性

/字段。這一直正確,只是在

.net framework 3.5 sp1

中新新增了一些支援,那就是你不一定必須對這些實體物件應用

datacontract

標記,這被稱作對

plain old c# objects(poco)

的序列化支援。

serializable

標記大家都很熟悉,它是

xmlserializer

的標記,在

wcf中其實很少用這個標記,因為我們

wcf用的是

datacontractserializer,

對應的標記也是

datacontract

。但對於

sp1來說,

serializable

也以xmlserializer

的規則被正常解析,其對應的

規則和serializer

對應,其公有可讀寫欄位被預設序列化。當然,你也可以通過

xmlelement

等標記來做高階對映,但這不是我們這裡需要談及的內容。

datacontract

對應的序列化處理叫做

datacontactserializer

。在wcf

中一旦乙個類被標記為

datacontract

,那麼只有標記為

datamember

的字段/

屬性才會被序列化。但如果你使用

datacontract

標記,那麼

datacontractserializer

預設將所有公有可讀寫字段序列化(這和

serializable

是一樣的)。假設我們有這麼乙個類:

public

class

person

public person(string strid, string strname)

private

string strid;

public

string id  set  }

public

string name;

public

person spouse;

private

int number = 343; }

對於dataserializer

來說,他和給所有公有屬性新增

datamember

並將類標記為

datacontract

是一樣的。下面的一段程式分別將乙個

person

的例項物件分別用

xmlserializer

和datacontractserializer

來序列化:

static

void main(string args)

xmlserializer xs = new

xmlserializer(typeof(person));

using (filestream fs = new

filestream("person_serialization.xml", filemode.create)) }

對於序列化後的內容我們得到的結果其實是一樣的:僅有公有屬性

/欄位被序列化

123aaron

456monica

但如果你使用了

datacontract

來標記這個類,卻沒有使用

datamember

,那麼沒有任何屬性

/欄位被序列化:

[datacontract]

public

class

person

set  }

public

string name;

public

person spouse;

private

int number = 343; }

/>

對於將類標記成

serializable

,datacontractserializer

的序列化可能讓我們覺得有些奇怪,它本質上是將所有可讀寫字段序列化,這其中還包括私有字段。例如我們將

person

類用[serializable]

標記,執行程式,我們會得到以下的結果:

aaron

0 monica

0 <_id>456

<_id>123

乙個簡單的

wcf程式來看看來檢驗一下是否正確。在

contract

生命中我們並不需要制定任何的標記,並宣告乙個得到

deskmesh

的方法:

[servicecontract]

public

inte***ce

ideskmesh

public

class

deskmesh

set 

} public

string name

public

string description

public

string unit

public

float price

public

datetime created

public

override

string tostring()

"r"nname: "r"nunit:"r"nprice:"r"ncreated:"r"nnumber:",

name, unit, price, created.toshortdatestring(),id.tostring(),number.tostring());

} }

客戶端呼叫,會返回乙個

deskmesh

的例項。通過結果,你會發現這完全和你標記

datacontract

的實體在

wcf兩端傳遞一模一樣。

void main(string args)

總結一下吧,

wcf中應用各個標記時所作的序列化處理: 1.

不給任何標記將會做

xml對映,所有公有屬性

/欄位都會被序列化 2.

[serializable

]標記會將所有可讀寫字段序列化 3.

[datacontract]

和[datamember]

聯合使用來標記被序列化的字段

WCF入門(十一) WCF安全

乙個強大的wcf服務安全系統,擁有兩種安全模式或級別預期的客戶端可以訪問的服務。這是常見的分布式事務的安全威脅正在放緩,在很大程度上由wcf決定。wcf服務有四個主要的安全功能,如下圖所示。wcf提供以下傳輸安全模式,以確保在客戶機和伺服器之間的安全通訊。多樣傳輸安全模式如下所述。name wcfs...

WCF入門(四) WCF架構

wcf是乙個分層架構,為開發各種分布式應用的充分支援。該體系結構在下面將詳細說明。約定層旁邊就是應用層,並含有類似於現實世界的約定,指定服務和什麼樣的資訊可以訪問它會使操作的資訊。約定基本都是在簡短的討論如下四種型別。服務執行時層僅僅是約定層之下。它指定在執行時出現的各種服務行為。有許多態別的行為,...

WCF程式設計系列 二 了解WCF

面向服務 服務是復用進化的結果,起初的復用是函式,物件導向程式設計的出現使復用從函式上公升到物件,隨後面向元件程式設計又將復用從物件上公升到元件,現在面向服務程式設計將復用提公升到服務層次。在面向服務的應用程式中,開發者只需要關注業務邏輯的編寫,以及通過可交換的 可互操作的服務終結點暴露業務邏輯。客...