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使用属性名称?
要在评论中添加一些问题...在好的旧(3.0)天WCF/DataContractSerializer
非常严格.如果您的类型未明确标记为[DataContract]
(或IXmlSerializable
用于后备),则它不会序列化.它使用标记为的成员[DataMember]
,如果指定,则使用属性上的显式名称,否则使用成员名称.生活很美好.
最近,代码被更改,允许"常规"类型被序列化 - 意思是:没有数据合同的那些.它使用与使用相同的方法来实现这一点BinaryFormatter
- 即它在field -level上工作.这是IMO不好的:
我知道为什么这是诱人的(允许WCF运输任意类型),但我体内的每一个肌肉都说这是一个净损失.让人们使用正确的工具(数据合同)比让他们破碎的类工作更好.在原始3.0中,会抛出一个异常,告诉您如何正确地解决这个问题:将其标记为a [DataContract]
并告诉它[DataMember]
要序列化的是哪个.
另请参见:混淆,序列化和自动实现的属性
它使用反射来获取它们 IIRC,如果您想要更多控制,您应该尝试使用 DataContract,它允许您指定确切的名称(使用[DataMember(Name = "DeviceID")]
)。另请参阅有关DataMemberAttribute的文档
归档时间: |
|
查看次数: |
3413 次 |
最近记录: |