WCF分布式開發步步為贏(7):WCF數據契約與序列化
[2] 序列化基本概念
[3] .NET 序列化機制
[4] 代碼實現與分析
本節繼續學習WCF分布式開發步步為贏(7):WCF數據契約與序列化.數據契約是WCF應用程序開發中一個重要的概念,毫無疑問實現客戶端與服務端數據契約的傳遞中序列化是非常重要的步驟。那么序列化是什么?為什么會有序列化機制?或者說它是為了解決什么問題?作用是什么?現有的.NET 序列化機制和WCF序列化機制有什么不同?我們在本節文章里都會詳細介紹。
下面我們正式進入今天的學習階段,首先來介紹一下數據契約的概念:
【0】數據契約(DataContract):
在WCF服務編程中我們知道,服務契約定義了遠程訪問對象和可供調用的服務操作方法,數據契約則是定義服務端和客戶端之間要傳送的自定義數據類型。在WCF項目中,聲明一個類型為DataContract,那么該類型就可以被序列化在服務端和客戶端之間傳送。類只有聲明為DataContract,該類型的對象才可以被傳送,且只有類的屬性會被傳送,需要在屬性生命前加DataMember聲明,這樣該屬性就可以被序列化傳送。默認情況屬性是不可傳遞的。類的方法不會被傳送。WCF對定義的數據契約的類型可以進行更加細節的控制,可以把一個成員屬性排除在序列化范圍以外,客戶端程序不會獲得被排除在外的成員屬性的任何信息,包括定義和數據。 代碼如下:
class MyDataContract
{
[DataMember(Name = "MyName")]//數據成員標記,支持別名定義
public string Name
{
get;
set;
}
[DataMember(Name = "MyEmail")]//數據成員標記,支持別名定義
public string Email
{
get;
set;
}
[DataMember]//數據成員標記
public string Mobile
{
get;
set;
}
//沒有[DataMember]聲明,不會被序列化
public string Address
{
get;
set;
}
}
}
上面類聲明為DataContract,部分屬性聲明為DataMember(數據成員)。可以序列化為客戶端傳送。Address成員屬性沒有被聲明為DataMember,因此在交換數據時,不會傳輸Address的任何信息。聲明為DataMember的成員也可以自定義客戶端可見的別名 如:[DataMember(Name = "MyName")]//數據成員標記,支持別名定義。