C# 在VisualStudio2010中,如何删除XmlSerializer以使用DataContractSerializer?

C# 在VisualStudio2010中,如何删除XmlSerializer以使用DataContractSerializer?,c#,visual-studio-2010,wcf,datacontractserializer,C#,Visual Studio 2010,Wcf,Datacontractserializer,我创建了一个.NET4.0WCFWeb服务,并将其安装在我们的内部服务器上 现在,我用一个查询web服务的简单项目来测试这一点 但是,我发现我所有的属性名都附加了k_BackingField字符串 [System.Runtime.Serialization.DataMemberAttribute(Name="<WoNumber>k__BackingField", IsRequired=true)] public string WoNumberk__BackingFie

我创建了一个.NET4.0WCFWeb服务,并将其安装在我们的内部服务器上

现在,我用一个查询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");
            }
        }
    }
[System.Runtime.Serialization.DataMemberAttribute(Name=“k\uu BackingField”,IsRequired=true)]
公共字符串WoNumberk_uu_BackingField{
得到{
返回这个.WoNumberk_uubackingfield;
}
设置{
if((object.ReferenceEquals(this.WoNumberk\uu backingfield,value)!=true)){
this.WoNumberk\uuu backingfield=值;
本.RaisePropertyChanged(“WoNumberk_uuBackingfield”);
}
}
}
我搜索了这个k_BackingField参数,发现这个链接是我最好的参考:

显然,我不知怎么用了而不是

我似乎找不到的是如何“撤消”XmlSerialization并启用DataContractSerializer

在我的项目中,我曾尝试在整个项目中搜索以下XML关键字,但它们似乎没有出现:

  • XmlSerializerFormat
  • System.Xml.Xml序列化
  • XmlSerializer
是否有人知道如何删除XmlSerialization,然后使用DataContractSerializator重新添加我的服务引用


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

问题不是您使用了
XmlSerializer
——问题是您在服务上使用了使用
[Serializable]
属性声明的某些类,并且在该类上使用了自动属性

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

要解决此问题,您可以通过更改服务器端代码进行以下选择:

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

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

听起来不错。因此,如果我的
[DataContract]的
[DataMember]
字段之一
返回自定义类MyClass1,该类是否也必须具有
[DataContract]
并使用
[DataMember]声明其所有方法
装饰?我没有收到你的回复,所以你知道我做了什么吗?我试过了。首先,我在没有数据的情况下尝试了我的类-狗屎不起作用。所以,在我所有的属性上粘贴
[DataMember]
后,我又试了一次,
[DataContract]
到类中,并给它一个声明为空的
[ServiceContract]
接口。他妈的成功了!问题解决了!:)不一定,您可以在不同的类中混合/匹配序列化属性。请注意,如果将
[Serializable]
添加到该类MyClass1中,您将使用
[Serializable]
编程模型-即,正在序列化的字段。