向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; }
}
在我们这边,这导致Baz
和Zed
在反序列化时突然开始为null,直到我们更新了服务引用。事实上,实际对象在Bar
之后按字母顺序有大约20个属性,它们都是null(或者0
表示int,false
表示bools,等等)。
反序列化失败似乎是一种奇怪的方式。它没有抛出异常,也没有忽略它一无所知的新属性。。。。它只是将新属性后面按字母顺序出现的每个属性反序列化为默认值。
所以我的问题是,这里发生了什么,我该如何预防?最好是,我希望客户端有某种设置,告诉它"忽略新属性",但告诉服务提供商他们如何防止未来发生破坏性的更改也可以。
不具有的Order属性的当前类型的数据成员DataMemberAttribute属性集,按字母顺序排列。
因此,如果添加一个新属性,而不包含DataMemberAttribute的Order属性,则该属性按字母顺序排列。
根据这里的讨论,您唯一的选择是:
- 将序列化程序更改为其他程序
- 请确保XML中元素的顺序与属性的顺序相匹配。也许您可以始终使用DataMemberAttribute的Order属性
确保你的dll排列整齐,我在过去看到过一些非常奇怪的问题,服务的一侧指向过时的dll
还要记住数据合约的基本原理