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

WCF 資料契約基礎:DataContract/DataMember 屬性、序列化流程與客戶端代碼生成解析

     編輯:關於.NET

為何需要資料契約?

WCF 傳遞 CLR 內建型別 (string/int) 自動序列化為 XML Infoset。自訂類別需顯式宣告序列化規則。傳統 [Serializable] 要求所有成員可序列化、不支援別名。DataContract 解決此限制:

  • 可標註 Enum/Struct/Class
  • 成員需顯式 [DataMember] 才序列化 (Opt-in)
  • 支援 Name (別名)、Namespace、IsRequired、Order (序列化順序)

資料契約定義範例

[DataContract(Name="Customer", Namespace="HenllyeeDataContract")]
public class Customer {
    [DataMember(Name="FirstName", IsRequired=false, Order=0)] public string FirstName { get; set; }
    [DataMember(Name="LastName", IsRequired=false, Order=1)] public string LastName { get; set; }
    [DataMember(Name="Age", IsRequired=false, Order=2)] public int Age { get; set; }
    [DataMember(Name="Salary", IsRequired=false, Order=3)] public decimal Salary { get; set; }
}

建議標註在屬性而非欄位。

服務契約與實作

[ServiceContract(Name="CustomerManagerService", Namespace="https://Henllyee.cnblogs.com/2008/06/29")]
public interface ICustomerManager {
    [OperationContract(Name="SaveCustomerInfo", Action="...", ReplyAction="...")]
    void SaveCustomer(Customer customer);
    [OperationContract(Name="GetCustomerInfo", Action="...", ReplyAction="...")]
    Customer GetCustomer();
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class CustomerManager : ICustomerManager {
    private Customer _customer;
    public void SaveCustomer(Customer c) => _customer = c;
    public Customer GetCustomer() => _customer;
}

客戶端代碼生成觀察

加入服務參考後,生成的 Proxy 類別特徵:

  • 實作 IExtensibleDataObject (保留未知資料)、INotifyPropertyChanged
  • 私有欄位加 Field 後綴 (FirstNameField)
  • 原私有成員變為公有屬性
  • 屬性標註 [DataMember]、[OptionalField]
即使伺服器端成員為 private,客戶端生成代碼皆為 public,因序列化只關心資料結構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved