WCF Xml序列化和自动实现的属性

Tim*_*ong 7 c# xml rest wcf serialization

我正在尝试使用WCF RESTful Web服务,而我遇到了自动实现属性的问题.

我有一个名为DeviceDescriptor的类,定义如下:

public class DeviceDescriptor
{
    public string DeviceId { get; set; }
    public string DisplayName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个RESTful WCF服务,它应该返回一个DeviceDescriptors列表 - 这是我的服务合同:

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

[WebGet(UriTemplate = "/Chooser/Ping")]
[OperationContract]
string Ping();
}
Run Code Online (Sandbox Code Playgroud)

好吧,它有点工作,除了在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>
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法解决这个问题呢?为什么没有; WCF使用属性名称?

Mar*_*ell 9

要在评论中添加一些问题...在好的旧(3.0)天WCF/DataContractSerializer非常严格.如果您的类型未明确标记为[DataContract](或IXmlSerializable用于后备),则它不会序列化.它使用标记为的成员[DataMember],如果指定,则使用属性上的显式名称,否则使用成员名称.生活很美好.

最近,代码被更改,允许"常规"类型被序列化 - 意思是:没有数据合同的那些.它使用与使用相同的方法来实现这一点BinaryFormatter- 即它在field -level上工作.这是IMO不好的:

  • 字段是实现,而不是合同
  • 如果你改变......它是脆弱的!
  • 它没有多少水来防止混淆
  • 像往返于自动道具那样无辜的东西打破它(自动道具有真正奇怪的字段名称,无法在常规C#中模拟)

我知道为什么这是诱人的(允许WCF运输任意类型),但我体内的每一个肌肉都说这是一个净损失.让人们使用正确的工具(数据合同)比让他们破碎的类工作更好.在原始3.0中,会抛出一个异常,告诉您如何正确地解决这个问题:将其标记为a [DataContract]并告诉它[DataMember]要序列化的是哪个.

另请参见:混淆,序列化和自动实现的属性


Ant*_*eru 4

它使用反射来获取它们 IIRC,如果您想要更多控制,您应该尝试使用 DataContract,它允许您指定确切的名称(使用[DataMember(Name = "DeviceID")])。另请参阅有关DataMemberAttribute的文档