本節主要講述資料協定的一些理論知識,在此記錄一下,用於以後的翻查。
1.資料協定概述
--預設情況下,windows communication foundation(wcf)使用稱為資料協定序列化程式的序列化引擎對資料進行序列化和反序列化(與xml進行相互轉換)
--所有.net framework 基元型別(如整型和字串型)以及某些被視為基元的型別(如datetime和xmlelement)無需做其他任何準備工作就可序列化並被視為擁有預設資料協定
--必須為所建立的新複雜型別定義資料協定以便可以進行序列化
--正常情況下可通過將datacontractattribute屬性應用到該型別來完成該任務
--可以將此屬性應用到類、結構和列舉
--然後必須將datamemberattribute屬性應用到資料協定型別的每個成員,以指示這些成員為資料成員,即應進行序列化
--資料協定是使用「選擇性加入」程式設計模型設計的;未用datamemberattribute屬性顯式標記的任何內容均不可序列化。
--可以將datamemberattribute屬性應用於字段、屬性和事件。
--成員可訪問性級別(internal、private、protected或public)對資料協定無任何影響。
--如果將datamemberattribute屬性應用於靜態成員,則將忽略該屬性。
--在序列化期間,為屬性資料成員呼叫property-get**來獲取要序列化的屬性的值。
--在反序列化期間,首先建立乙個未初始化的物件,而不在該型別上呼叫任何建構函式,然後反序列化所有資料成員。
--在反序列化期間,為屬性資料成員呼叫property-set**,將屬性設定為要反序列化的值。
--對於將要生效的資料協定,它必須能序列化其所有資料成員。泛型型別的處理方式與非泛型型別完全相同,泛型引數無特殊要求。
--無論用於泛型型別引數(t)的型別能否序列化,此型別都可序列化。因為它必須能序列化所有資料成員,所以下面的型別僅在泛型型別引數也可序列化時才可序列化
2.資料協定名稱
--有時,客戶端和服務不共享相同的型別。但只要兩端的資料協定是等同的,客戶端和服務仍然可以互相傳遞資料
--完全限定的數協定名稱由命名空間和名稱組成。
--資料成員只有名稱,而沒有命名空間。
--處理資料協定時,wcf基礎結構對於命名空間以及資料協定和資料成員的名稱區分大小寫。
--資料協定命名空間
--資料協定命名空間採用統一資源識別符號(uri)的形式
--設定datacontractattribute的namespace屬性
--資料協定名稱
--給定型別的預設資料協定名稱是該型別的名稱。
--若要重寫預設值,請將datacontractattribute的name屬性設定為其他名稱
--資料成員名稱
--給定欄位或屬性的預設資料成員名稱是該字段或屬性的名稱。
--若要重寫預設值,請將datamemberattribute的name屬性設定為其他值
3.資料協定等效性
--要使資料協定等效,其命名空間和名稱必須相同。此外,某一端上的每個資料成員還必須在另一段上具有等效的資料成員。
--要使資料成員等效,其名稱必須相同。此外,它們還必須表示同意型別的資料,也就是說,其資料協定必須等效
如果同一端(傳送方或接收方)存在兩種型別,而其資料協定又不等效(例如,它們的資料成員不同),則不應為它們指定相同的名稱和命名空間。否則,可能會引發異常。
4.資料協定已知型別
--資料協定已知型別
--傳送的資料協定源自預期的資料協定
--要傳輸的訊息的宣告型別是介面,而非類、結構或列舉。
--要傳輸的資訊的宣告型別是object
--有些型別(包括.net framework 型別)具有屬於上述三種類別之一的成員。例如,hashtable使用object在雜湊表中儲存實際物件
--knowntypeattribute類
--通過首先檢查傳入訊息選擇為反序列化而例項化的型別,以確定訊息內容遵循的資料協定。然後反序列化引擎嘗試查詢實現與訊息內容相容的資料協定的clr型別。反序列化引擎在此過程中允許的候選型別集稱為反序列化程式的「已知型別」集。
--讓反序列化引擎了解某個型別的一種方法是使用knowntypeattribute.
--不能將屬性應用於單個資料成員,只能將它應用於整個資料協定型別。
--將屬性應用於可能為類或結構的「外部型別」。在其最基本的用法中,應用屬性會將型別指定為「已知型別」。只要反序列化外部型別的物件或通過其成員引用的任何物件,這就會導致已知型別成為已知型別集的一部分。
--可以將多個knowntypeattribute屬性應用於同一型別。
5.資料協定版本管理
--重大更改與非重大更改
--對資料協定的更改可能是重大更改,也可能是非重大更改,對資料協定進行非重大更改時,使用較早版本協定的應用程式和使用較新版本協定的應用程式可以互相通訊。另一方面,如果進行重大更改,則會組織單向或者雙向通訊
--下面的更改始終是重大更改
--更改資料協定的name或namespace值
--通過daamemberattribute的order屬性來更改資料成員的順序。
--重新命名資料成員。
--更改資料成員的資料協定
--新增或移除資料成員
--將具有額外欄位的型別反序列化為具有缺失欄位的型別時,將忽略額外的資訊。
--具有缺失欄位的型別反序列化為具有額外欄位的型別時,額外欄位將保留其預設值,通常為零或null.
--必需的資料成員
--通過將datamemberattribute的isrequired屬性設定為true,可以將資料成員標記為必需的資料成員。如果反序列化時缺少必需的資料,則會引發異常,而不是將資料成員設定為其他預設值。
--新增必需的資料成員是重大更改。
--移除在任何早起版本中標記為必需成員的資料成員也是重大更改。
--將isrequired屬性值從true更改為false不是重大更改;如果型別的任何早起版本都沒有相應資料成員,將該屬性值從false更改為true就可能是重大更改。
菜鳥從零學習資料庫(一) 三正規化
菜鳥從零學習資料庫 一 三正規化 說到軟體開發 就不能不說資料庫 說到資料庫 就不能不說三正規化 其實資料庫正規化一共有六個 除了第一 二 三正規化以 外還有第四 第五正規化和乙個bc正規化 在此我們只討論三正規化 有興趣的朋友可以自己找一些專業的書籍進一步學習 第一正規化 1nf 第一正規化是指資...
從零基礎學習資料庫之DML語言(二)
select 語句的乙個基本結構了解了,繼續學習一些語法知識吧。我們現在做一件稍微麻煩的事情,希望查詢結果集中顯示出作者的姓名,即au fname和au lname的結合。這就需要對列進行運算。使用字串連線符就可以做到了。程式清單如圖所示,在乙個 裡進行。字串連線運算子 例如 abc def abc...
從零基礎學習資料庫之DML語言(一)
等等,au lname 是什麼?怎麼這個列的名稱這麼亂?這是一種命名規則,是人們長期以來總結的比較合適的命名規則,叫做匈牙利命名法。第一次看到這種命名時,相比把變數名命名成 a b 或者 a1 雖然比較亂,但是這樣命名的結果是有意義,更容易理解。當然,不可否認的是也許針對某個特別的程式設計例項會有更...