假设我在客户端和服务器的v1上有以下数据协定。
[DataContract]
public class Customer
{
[DataMember]
public string Name;
[DataMember]
public string LastName;
}
现在,我将服务器更新为新版本的DataContract V2 - 添加新成员年龄
[DataMember]
public int Age = 25;
根据this link,如果客户端未指定成员,则上述内容应该默认为25。
我找到了another way来让它发挥作用。确保DataMember.EmitDefaultValue = True(默认值)。
[DataMember]
public int Age;
[OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
{
Age = 25;
}
我的问题是为什么字段初始化方法不起作用?
答案 0 :(得分:0)
在反序列化期间不会调用构造函数或字段初始值设定项。我没有找到后者的文档,但是如果你把一个私有字段放在同一个类中,而不是[DataMember]
,那么你会注意到,这个字段也没有被初始化。
我最终使用的方法是定义一个方法来设置默认值,并在构造函数和[OnDeserializing]
方法中调用此方法。
例如(请原谅我使用VB.NET,这就是我手边的内容)
Public Sub New()
SetDefaults()
End Sub
' OnDeserializing happens before deserialization
<OnDeserializing>
Private Sub OnDeserializing(ByVal c As StreamingContext)
SetDefaults()
End Sub
Private Sub SetDefaults()
Foo = "FooValueV2"
Bar = "BarValueV2"
OnlyInV2 = "OnlyInV2Value"
OnlyInV2Int = 98765
End Sub