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

WCF 資料合約與序列化:DataContractSerializer 原理與實作指南

     編輯:關於.NET

WCF 採用 資料合約 (Data Contract) 定義服務邊界傳遞的資料結構,序列化引擎為 DataContractSerializer (DCS),取代傳統 .NET 序列化器以滿足跨平台互通需求。

為何不沿用 .NET 內建序列化?

序列化器特點限制
BinaryFormatter二進位、型別保真、效能高強制 .NET 雙端、含組件版本、不跨平台
SoapFormatterSOAP XML、跨平台效能差、仍含 .NET 型別資訊、已過時
XmlSerializer純 XML、可控制輸出僅公開屬性/欄位、不支援介面/泛型集合完整

DCS 設計目標:僅序列化資料、不含型別身分、產出標準 XML Infoset、支援版本容錯、效能優於 XmlSerializer。

資料合約定義規則

[DataContract(Namespace = "https://myschema.org")]
public class UserProfile
{
    [DataMember(Order = 1, Name = "UserName", IsRequired = true)]
    public string Name { get; set; }

    [DataMember(Order = 2, EmitDefaultValue = false)]
    public string Email { get; set; }

    [DataMember(Order = 3)]
    public string Mobile { get; set; }

    // 無 DataMember → 不序列化
    public string InternalNote { get; set; }
}
  • Order:控制 XML 元素順序,利於版本演進 (新欄位加在最後)。
  • Name:自訂 XML 元素名稱,實現別名。
  • IsRequired:反序列化時必須存在,否則拋例外。
  • EmitDefaultValue=false:預設值 (null/0/false) 不輸出 XML,減小封包。

DCS 核心運作流程

  1. 寫入端:WriteObject → WriteStartObject → WriteObjectContent (依 Order 寫入 DataMember) → WriteEndObject。
  2. 讀取端:ReadObject → 驗證元素名/命名空間 → 依 Order 讀取 → 建立物件 → 設定屬性。
  3. 版本容錯:IExtensibleDataObject 保留未知資料 (Round-tripping),升級後舊用戶端仍能保留新欄位資料。

已知型別

多型序列化需宣告 [KnownType(typeof(Derived))] 或設定 ServiceKnownType,否則衍生類別無法正確序列化/反序列化。

程式碼範例:服務與客戶端

// 服務端
[ServiceContract]
public interface IUserService
{
    [OperationContract] bool AddUser(UserProfile user);
    [OperationContract] UserProfile GetUser(string name);
}

// 客戶端反序列化後的型別 (由 svcutil/Visual Studio 產生)
public partial class UserProfile : IExtensibleDataObject, INotifyPropertyChanged
{
    [DataMember] public string UserName { get; set; }
    [DataMember] public string UserEmail { get; set; }
    [DataMember] public string Mobile { get; set; }
    // 注意:屬性名稱依服務端 Name 別名調整
    // 自動實作 INotifyPropertyChanged 支援 WPF/UI 繫結
}

效能與最佳化

  • DCS 預設不序列化 null 集合,建議初始化為空集合避免客戶端 NullReference。
  • 大量資料考慮 DataContractSerializer 建構子預先載入已知型別,減少啟動反射開銷。
  • 二進位編碼 (binaryMessageEncoding) 可進一步縮減 30-50% 封包體積,需雙端支援。

總結

DataContract + DataContractSerializer 是 WCF 互通性的基石。明確定義合約、控制序列化細節 (Order/Name/Required/EmitDefaultValue)、善用版本容錯機制,能建構穩健、可演進的服務介面。

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