我们使用C#代码使用WCF服务。通过右键单击"添加服务引用"在Visual Studio中生成客户端。并将其指向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个属性,它们都是空的(或者0
用于整数,false
用于bool等。)
反序列化失败似乎是一种奇怪的方式。它没有抛出异常或忽略它对它没有任何了解的新属性....它只是使每个属性在新的属性后按字母顺序反序列化为默认值。
所以我的问题是,这里发生了什么,我该如何预防呢?最好是,我喜欢某种设置,让客户告诉它“忽略新的属性”,&#34;但是告诉服务提供商他们如何防止未来发生变化也很好。
答案 0 :(得分:2)
MSDN has an article列出了数据库的序列化顺序。该文件的一个关键点:
当前类型的数据成员,没有Order属性 DataMemberAttribute属性设置,以按字母顺序排列顺序。
因此,如果添加新属性,而没有DataMemberAttribute的Order-property,则按字母顺序排列该属性。
基于discussion here,您唯一的选择是:
答案 1 :(得分:0)
确保您的dll排队,我在过去看到过一些非常时髦的问题,其中服务的一方指向过时的dll