向WCF服务中的对象添加属性会破坏客户端

本文关键字:属性 客户端 添加 对象 WCF 服务 | 更新日期: 2023-09-27 18:27:22

我们使用C#代码使用WCF服务。客户端是在VisualStudio中通过右键单击"添加服务引用"并将其指向WSDL生成的。

最近,WCF提供程序向它们序列化的一个对象添加了一些属性。课程从开始

public class MyClass
{
        public string Foo { get; set; }
        public string Baz { get; set; }
        public string Zed {get; set; }
}

到此:

public class MyClass
{
        public string Foo { get; set; }
        public string Bar { get; set; } //<= New Property
        public string Baz { get; set; }
        public string Zed {get; set; }
}

在我们这边,这导致BazZed在反序列化时突然开始为null,直到我们更新了服务引用。事实上,实际对象在Bar之后按字母顺序有大约20个属性,它们都是null(或者0表示int,false表示bools,等等)。

反序列化失败似乎是一种奇怪的方式。它没有抛出异常,也没有忽略它一无所知的新属性。。。。它只是将新属性后面按字母顺序出现的每个属性反序列化为默认值。

所以我的问题是,这里发生了什么,我该如何预防?最好是,我希望客户端有某种设置,告诉它"忽略新属性",但告诉服务提供商他们如何防止未来发生破坏性的更改也可以。

向WCF服务中的对象添加属性会破坏客户端

MSDN有一篇文章列出了数据成员的序列化顺序。该文件的一个关键点是:

不具有的Order属性的当前类型的数据成员DataMemberAttribute属性集,按字母顺序排列。

因此,如果添加一个新属性,而不包含DataMemberAttribute的Order属性,则该属性按字母顺序排列。

根据这里的讨论,您唯一的选择是:

  1. 将序列化程序更改为其他程序
  2. 请确保XML中元素的顺序与属性的顺序相匹配。也许您可以始终使用DataMemberAttribute的Order属性

确保你的dll排列整齐,我在过去看到过一些非常奇怪的问题,服务的一侧指向过时的dll

还要记住数据合约的基本原理