在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服务是否需要修改,以便它公开我想要的序列化器?

在Visual Studio 2010中,如何删除XmlSerializer来使用DataContractSeriali

问题不在于你使用了XmlSerializer -问题是你在你的服务上使用了一些用[Serializable]属性声明的类,并在该类上使用了自动属性。

序列化器使用[Serializable]属性修饰的类型的语义是它的字段将被序列化(而不是它的属性)。使用自动属性,编译器将生成"支持字段",当你为服务创建代理(添加服务引用)时,它将默认尝试创建一个与服务器中的契约等效的数据契约。

要解决这个问题,您有几个选择,通过更改服务器端代码:

  • 不要使用[Serializable],而是使用[DataContract]模型(这需要用[DataMember]来修饰你想要序列化的属性)
  • 保留[Serializable],但不使用属性,使用字段代替
  • (如果适用)使用POCO序列化(公共字段/属性将被序列化),不需要属性。

另一种选择是在服务器和客户端之间共享契约(即,不要使用Add Service Reference,而是将数据/服务契约从服务项目复制到客户端项目中)。