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 (保留未知資料)、INotifyPropertyChangedField 後綴 (FirstNameField)[DataMember]、[OptionalField]即使伺服器端成員為 private,客戶端生成代碼皆為 public,因序列化只關心資料結構。