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