2009-09-26 85 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