C# WCF DataContractSerializer 類
原文地址:點選開啟連結
DataContractSerializer 類
使用提供的資料協定,將型別例項序列化和反序列化為 XML 流或文件。 無法繼承此類。
名稱空間: System.Runtime.Serialization
程式集: System.Runtime.Serialization(在 System.Runtime.Serialization.dll 中)
備註
使用 DataContractSerializer 類可以將型別例項序列化和反序列化為 XML 流或文件。 通過將 DataContractAttribute 特性應用於類,而將DataMemberAttribute 特性應用於類成員,可以指定要序列化的屬性和欄位。
從字面意思來理解就是:資料契約序列化,本文主要是講解用DataContractSerializer 序列化和反序列化.
DataContractAttribute與DataMenmberAttribute
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.Runtime.Serialization
{
// 摘要:
// 指定該型別要定義或實現一個資料協定,並可由序列化程式(如 System.Runtime.Serialization.DataContractSerializer)進行序列化。
// 若要使其型別可序列化,型別作者必須為其型別定義資料協定。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)]
public sealed class DataContractAttribute : Attribute
{
string name;
string ns;
bool isNameSetExplicitly;
bool isNamespaceSetExplicitly;
bool isReference;
bool isReferenceSetExplicitly;
// 摘要:
// 初始化 System.Runtime.Serialization.DataContractAttribute 類的新例項。
public DataContractAttribute()
{
}
// 摘要:
// 獲取或設定一個值,該值指示是否保留物件引用資料。
//
// 返回結果:
// 如果使用標準 XML 保留物件引用資料,則為 true;否則為 false。 預設值為 false。
public bool IsReference
{
get { return isReference; }
set
{
isReference = value;
isReferenceSetExplicitly = true;
}
}
public bool IsReferenceSetExplicitly
{
get { return isReferenceSetExplicitly; }
}
//
// 摘要:
// 獲取或設定型別的資料協定的名稱空間。
//
// 返回結果:
// 協定的名稱空間。
public string Namespace
{
get { return ns; }
set
{
ns = value;
isNamespaceSetExplicitly = true;
}
}
public bool IsNamespaceSetExplicitly
{
get { return isNamespaceSetExplicitly; }
}
//
// 摘要:
// 獲取或設定型別的資料協定的名稱。
//
// 返回結果:
// 資料協定的本地名稱。 預設值是應用了該屬性的類的名稱。
public string Name
{
get { return name; }
set
{
name = value;
isNameSetExplicitly = true;
}
}
public bool IsNameSetExplicitly
{
get { return isNameSetExplicitly; }
}
}
}
DataContractAttribute
從應用在DataContractAttribute上的AttributeUsageAttribute特性看,該特性只能用於列舉、類、結構體而不能應用於介面,從關鍵字sealed知道DataContractAttribute是不可被繼承的。AllowMutiple屬性為False,表明一個資料型別上只能應用一個DataContractAttribute特性。
從上面對DataContractAttribute定義看出DataContractAttribute僅僅包含5個屬性成員,其中Name和Namespace表示資料契約的名稱和名稱空間,IsReference表示在進行序列化的時候是否保持物件現有的引用結構,該屬性預設值為False。
資料契約成員採用顯示選擇機制,也就是說,應用了DataContractAttribute特性的資料型別的屬性/欄位不會自動生成契約的資料成員,而只有那些應用了DataMemberAttribute特性的屬性/欄位才屬於資料契約的成員。
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.Runtime.Serialization
{
// 摘要:
// 當應用於型別的成員時,指定該成員是資料協定的一部分並可由 System.Runtime.Serialization.DataContractSerializer
// 進行序列化。
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class DataMemberAttribute : Attribute
{
string name;
bool isNameSetExplicitly;
int order = -1;
bool isRequired;
bool emitDefaultValue = Globals.DefaultEmitDefaultValue;
// 摘要:
// 初始化 System.Runtime.Serialization.DataMemberAttribute 類的新例項。
public DataMemberAttribute()
{
}
//
// 摘要:
// 獲取或設定資料成員名稱。
//
// 返回結果:
// 該資料成員的名稱。 預設值是應用該屬性的目標的名稱。
public string Name
{
get { return name; }
set { name = value; isNameSetExplicitly = true; }
}
public bool IsNameSetExplicitly
{
get { return isNameSetExplicitly; }
}
//
// 摘要:
// 獲取或設定成員的序列化和反序列化的順序。
//
// 返回結果:
// 序列化或反序列化的數字順序。
public int Order
{
get { return order; }
set
{
if (value < 0)
throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.OrderCannotBeNegative)));
order = value;
}
}
// 摘要:
// 獲取或設定一個值,該值用於指示序列化引擎在讀取或反序列化時成員必須存在。
//
// 返回結果:
// 如果該成員是必需的,則為 true;否則為 false。
//
// 異常:
// System.Runtime.Serialization.SerializationException:
// 該成員不存在。
public bool IsRequired
{
get { return isRequired; }
set { isRequired = value; }
}
// 摘要:
// 獲取或設定一個值,該值指定是否對正在被序列化的欄位或屬性的預設值進行序列化。
//
// 返回結果:
// 如果應該在序列化流中生成成員的預設值,則為 true;否則為 false。 預設值為 true。
public bool EmitDefaultValue
{
get { return emitDefaultValue; }
set { emitDefaultValue = value; }
}
}
}
從上面應用在DataMemberAttribute上的AttributeUsageAttribute特性來看,該特性只能應用在欄位和屬性上。因為只有這兩種元素才是“資料”成員。4個屬性分別表示如下的含義。
- Name:資料成員的名稱,預設為欄位或屬性的名稱。
- Order:相應的資料成員在最終序列化的XML中出現的位置,Order值越小越考前,預設值為-1.
- IsRequired:表明屬性成員是否是必須的成員。預設值為false,表明該成員是可以預設的。
- EmitDefaultValue :獲取或設定一個值,該值指定是否對正在被序列化的欄位或屬性的預設值進行序列化。如果應該在序列化流中生成成員的預設值,則為 true;否則為 false。 預設值為 true。
相關文章
- C# 實體類序列化與反序列化二 (DataContractSerializer)C#
- C# WCF入門C#
- C#動態呼叫WCF介面C#
- WCF:傳輸EntityFramework 實體類的POCO 代理Framework
- C#抽象類C#抽象
- C# Winform WCF 除錯服務端的程式(三種方法)C#ORM除錯服務端
- C#中介面、基類與類C#
- C#學習——基本類——Math類C#
- MSMQ In WCFMQ
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- C# 靜態類C#
- c#之hashtable類C#
- c#實體類C#
- C#快取類C#快取
- WCF學習筆記(一):WCF簡介筆記
- C#定時器中呼叫WCF服務+自定義回撥函式C#定時器函式
- WCF除錯異常資訊:ServiceHost 僅支援類服務型別除錯型別
- WCF、Web API、WCF REST、Web Service之區別WebAPIREST
- 學習 WCF (3)--開發WCF客戶程式
- WCF筆記筆記
- WCF基礎
- WCF Rest ServiceREST
- c#封裝DBHelper類C#封裝
- 瞭解下C# 類(Class)C#
- 有關C#抽象類C#抽象
- c#中DateTime類C#
- c#之oracledataAdapter類C#OracleAPT
- worksheet類成員_c#C#
- C# 生成RSS通用類C#
- C# HTTP幫助類C#HTTP
- WCF Security:Silverlight authentication for WCF service based on security token
- c#之基類派生類base_小記C#
- c# 基類派生類成員方法訪問C#
- C#神器"BlockingCollection"類實現C#神仙操作C#BloCGC
- C#各類集合介紹C#
- C#中PDF文件操作類C#
- C#中URL的操作類C#
- c# Lambda操作類封裝C#封裝