1

我创建了一个 .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.序列化
  • XmlSerialzer

有谁知道如何删除XmlSerialization然后使用DataContractSerializer重新添加我的服务引用?

或者,是否需要修改我的 WCF 服务以公开我想要的序列化程序?

4

1 回答 1

3

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

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

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

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

另一种选择是在服务器和客户端之间共享合同(即,不要使用添加服务引用,并将数据/服务合同从服务项目复制到客户端)。

于 2013-03-08T18:15:28.083 回答