在Visual Studio 2010中,如何删除XmlSerializer来使用DataContractSeriali
本文关键字:XmlSerializer 删除 DataContractSeriali 2010 Studio Visual 何删除 | 更新日期: 2023-09-27 18:02:54
我创建了一个。net 4.0 WCF web服务,并把它放在我们的内部服务器上。
现在,我用一个查询web服务的简单项目来测试它。
然而,我发现我所有的属性名都被附加了k_BackingField字符串。
[System.Runtime.Serialization.DataMemberAttribute(Name="<WoNumber>k__BackingField", IsRequired=true)]
public string WoNumberk__BackingField {
get {
return this.WoNumberk__BackingFieldField;
}
set {
if ((object.ReferenceEquals(this.WoNumberk__BackingFieldField, value) != true)) {
this.WoNumberk__BackingFieldField = value;
this.RaisePropertyChanged("WoNumberk__BackingField");
}
}
}
我对这个k_BackingField参数进行了搜索,发现这个链接是我最好的参考:
如何命令序列化器不放k__backingfield
显然,我使用了XmlSerializer而不是DataContractSerializer。
我似乎找不到的是如何"撤销"XmlSerialization和启用DataContractSerializer。
在我的项目中,我尝试在整个项目中搜索以下XML关键字,但它们似乎没有拉起:
- XmlSerializerFormat
- System.Xml.Serialization
- XmlSerialzer
有没有人知道如何删除XmlSerialization,然后重新添加我的服务引用使用DataContractSerializer?
或者,我的WCF服务是否需要修改,以便它公开我想要的序列化器?
问题不在于你使用了XmlSerializer
-问题是你在你的服务上使用了一些用[Serializable]
属性声明的类,并在该类上使用了自动属性。
[Serializable]
属性修饰的类型的语义是它的字段将被序列化(而不是它的属性)。使用自动属性,编译器将生成"支持字段",当你为服务创建代理(添加服务引用)时,它将默认尝试创建一个与服务器中的契约等效的数据契约。
要解决这个问题,您有几个选择,通过更改服务器端代码:
- 不要使用
[Serializable]
,而是使用[DataContract]
模型(这需要用[DataMember]
来修饰你想要序列化的属性) - 保留
[Serializable]
,但不使用属性,使用字段代替 - (如果适用)使用POCO序列化(公共字段/属性将被序列化),不需要属性。
另一种选择是在服务器和客户端之间共享契约(即,不要使用Add Service Reference,而是将数据/服务契约从服务项目复制到客户端项目中)。