首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 資料契約等效性與版本控制:成員增刪、IExtensibleDataObject 與往返資料保全

     編輯:關於.NET

資料契約描述交換資料結構,是序列化/反序列化的依據。Client/Server 需擁有等效資料契約才能有效交換。隨時間演進,契約版本變更(成員增刪、改名、改命名空間)不可避免,如何確保版本演進不破壞現有相容性,是本文核心主題。

一、資料契約等效性判斷標準

若兩個不同型別的資料契約物件序列化後產生相同 XML 結構,即視為等效。條件:

  • 相同契約名稱(DataContractAttribute.Name)
  • 相同命名空間(Namespace)
  • 相同資料成員集合(DataMemberAttribute.Name)
  • 成員出現順序一致(Order 屬性控制)

範例: Customer 與 Contact 型別/成員命名不同、定義順序不同,但透過 Name、Order 屬性對齊,序列化結果完全一致,故等效。

二、新增資料成員:預設相容與 IsRequired 陷阱

Server 端契約 CustomerV2 新增 Address,Client 仍用 CustomerV1(無 Address)。反序列化時:

  • 預設 IsRequired=false:成功,缺失成員保留預設值(null)。XSD 中對應 minOccurs="0"。
  • 設定 [DataMember(IsRequired=true)]:拋出 SerializationException。XSD 中 minOccurs 消失,XML 不符合結構定義。

缺失成員賦預設值: 實作 [OnDeserializing] 回呼方法初始化。

三、刪除資料成員:往返資料遺失問題與 IExtensibleDataObject 解決方案

Client 用 CustomerV1(含 Address),Server 用 CustomerV2(無 Address)。往返流程:

  1. Client 序列化含 Address 的 XML
  2. Server 反序列化 → Address 資料被捨棄
  3. Server 序列化回覆 → XML 無 Address
  4. Client 反序列化 → Address 變 null

造成「資料無故消失」的不可接受行為。

解決方案:實作 IExtensibleDataObject

[DataContract(...)]
public class CustomerV2 : IExtensibleDataObject
{
    public ExtensionDataObject ExtensionData { get; set; }
    // ...
}

DataContractSerializer 反序列化時,將未知 XML 元素反序列化存入 ExtensionData;序列化時將其寫回 XML。實測:CustomerV2 序列化輸出仍包含 <Address>,資料完整保全。

控制開關:IgnoreExtensionDataObject

  • DataContractSerializer 建構函數參數 / 唯讀屬性
  • ServiceBehaviorAttribute.IgnoreExtensionDataObject
  • 組態 <dataContractSerializer ignoreExtensionDataObject="true" />

設為 true 時忽略未知資料、不保全往返資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved