如何为wcf DataContracts的缺失成员指定默认值?

时间:2014-09-15 11:07:03

标签: .net wcf datacontract

假设我在客户端和服务器的v1上有以下数据协定。

[DataContract]
    public class Customer
    {
        [DataMember]
        public string Name;
        [DataMember]
        public string LastName;
    }

现在,我将服务器更新为新版本的DataContract V2 - 添加新成员年龄

    [DataMember]
    public int Age = 25;

根据this link,如果客户端未指定成员,则上述内容应该默认为25。

  • ClientV1(旧)调用ServerV2(新) - 在这种情况下,客户端不传递新成员。但是我发现数据成员的值为0(缺少成员应该获得默认值25)

我找到了another way来让它发挥作用。确保DataMember.EmitDefaultValue = True(默认值)。

[DataMember]
        public int Age;

        [OnDeserializing]
        internal void OnDeserializingMethod(StreamingContext context)
        {
            Age = 25;
        }

我的问题是为什么字段初始化方法不起作用?

1 个答案:

答案 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