2009-09-26 29 views
7

我正在嘗試使用WCF RESTful Web服務,並遇到自動實現屬性的問題。WCF Xml序列化和自動實現的屬性

我有一個叫DeviceDescriptor類,定義如下:

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

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

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

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

那麼,它的工作方式,除了在XML輸出中,屬性名稱不正確,它看起來像序列化程序正在使用自動生成的支持字段,而不是屬性名稱的「unutterable名稱」。我的輸出如下:

<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使用屬性名稱?

+0

的StackOverflow的悖論:我只是贏得了該項目的「熱門問題」徽章,但只有一個給予好評。 – 2011-08-05 13:36:15

回答

4

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

+0

這樣做。我必須在類上放置[DataContract]屬性,然後在屬性shazamm上添加[DataMember(Name =「xxx」)]屬性。 雖然它有點臭。我想知道爲什麼WCF發現所謂的私有的自動實現的支持字段並使用它們而不是公共屬性名稱? C#編譯器必須執行一些狡猾的代碼生成。 – 2009-09-26 20:00:47

+0

正如我所說,它可能使用反射來獲取屬性值的存儲位置,而不是屬性本身的名稱;但我不是WCF的專家,所以你應該問一個問題WCF實際上是如何發現這些名字的; – Anteru 2009-09-26 20:25:54

+0

(你已經完全回答了主要問題;但是爲了跟進我在下面簡要介紹的評論) – 2009-09-26 21:17:47

9

的文檔要添加一些細節到您在評論中提出的問題......在舊的(3.0)天WCF/DataContractSerializer是非常嚴格的。如果您的類型未明確標記爲[DataContract](或回退的IXmlSerializable),則不會序列化。它使用標記爲[DataMember]的成員,如果指定了屬性,則使用顯式名稱,否則使用成員名稱。生活很好。

最近,更改了代碼,允許「常規」類型被序列化 - 即:沒有數據合同的代碼。它使用與BinaryFormatter相同的方法執行此操作 - 即它在字段級別上工作。這是IMO不好:

  • 字段的實現,而不是合同
  • 它是易碎的,如果你改變...什麼!
  • 它不會從裝多少水對混淆
  • 東西就像一個天真無邪開關/自動PROP打破它(自動道具已經真正奇怪的字段名,不能在普通的C#模擬)

我知道爲什麼這是誘人的(允許WCF運輸任意類型),但是我身體中的每個肌腱都說這是一個淨損失。讓人們使用正確的工具(數據合同)比讓他們的破產類工作更好。在原來的3.0中,會出現一個異常,告訴你如何正確解決這個問題:將它標記爲[DataContract],並告訴它你想要序列化哪個[DataMember]

參見:Obfuscation, serialization and automatically implemented properties

+0

我必須同意你的觀點 - 不僅在實踐中這種變化很糟糕,而且「感覺」是錯誤的,因爲它違背了已經存在了這麼久的選擇加入哲學。 – 2009-09-28 05:58:49