[英]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不好的:
我知道為什么這是誘人的(允許WCF運輸任意類型),但我體內的每一個肌肉都說這是一個凈損失。 讓人們使用正確的工具(數據合同)比讓他們破碎的類工作更好。 在原始3.0中,會拋出一個異常, 告訴您如何正確地解決這個問題:將其標記為[DataContract]
並告訴它您要序列化哪個[DataMember]
。
另請參見: 混淆,序列化和自動實現的屬性
它使用反射來獲取它們IIRC,如果你想要更多的控制,你應該嘗試使用DataContract,它允許你指定確切的名稱(使用[DataMember(Name = "DeviceID")]
)。 另請參閱有關DataMemberAttribute的文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.