簡體   English   中英

WCF Xml序列化和自動實現的屬性

[英]WCF Xml Serialization and AutoImplemented Properties

我正在嘗試使用WCF RESTful Web服務,而我遇到了自動實現屬性的問題。

我有一個名為DeviceDescriptor的類,定義如下:

public class DeviceDescriptor
{
    public string DeviceId { get; set; }
    public string DisplayName { get; set; }
}

我有一個RESTful WCF服務,它應該返回一個DeviceDescriptors列表 - 這是我的服務合同:

[ServiceContract]
public interface IChooser
{
[WebGet(UriTemplate="/Chooser/RegisteredDevices")]
[OperationContract]
List<DeviceDescriptor> RegisteredDevices();

[WebGet(UriTemplate = "/Chooser/Ping")]
[OperationContract]
string Ping();
}

好吧,它有點工作,除了在XML輸出中,屬性名稱不正確,看起來序列化程序使用自動生成的支持字段的“不可知名稱”而不是屬性名稱。 我的輸出如下:

<DeviceDescriptor>
  <_x003C_DeviceId_x003E_k__BackingField>Pipe.Dome</_x003C_DeviceId_x003E_k__BackingField> 
  <_x003C_DisplayName_x003E_k__BackingField>Pipe diagnostic tool</_x003C_DisplayName_x003E_k__BackingField> 
</DeviceDescriptor>

那么,有沒有辦法解決這個問題呢? 為什么沒有; WCF使用屬性名稱?

要在評論中添加一些問題...在好的舊(3.0)天WCF / DataContractSerializer非常嚴格。 如果您的類型未明確標記為[DataContract] (或者用於回退的IXmlSerializable ),那么它將不會序列化。 它使用標記為[DataMember]的成員,如果指定,則使用屬性上的顯式名稱,否則使用成員名稱。 生活很美好。

最近,代碼被更改,允許“常規”類型被序列化 - 意思是:沒有數據合同的那些。 它使用與BinaryFormatter使用相同的方法來實現這一點 - 即它在field -level中工作。 這是IMO不好的:

  • 字段是實現,而不是合同
  • 如果你改變......那就太脆了!
  • 它沒有多少水來防止混淆
  • 像往返於自動道具那樣無辜的東西打破它(自動道具有真正奇怪的字段名稱,無法在常規C#中模擬)

我知道為什么這是誘人的(允許WCF運輸任意類型),但我體內的每一個肌肉都說這是一個凈損失。 讓人們使用正確的工具(數據合同)比讓他們破碎的類工作更好。 在原始3.0中,會拋出一個異常, 告訴您如何正確地解決這個問題:將其標記為[DataContract]並告訴它您要序列化哪個[DataMember]

另請參見: 混淆,序列化和自動實現的屬性

它使用反射來獲取它們IIRC,如果你想要更多的控制,你應該嘗試使用DataContract,它允許你指定確切的名稱(使用[DataMember(Name = "DeviceID")] )。 另請參閱有關DataMemberAttribute的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM