.net 如何为缺少的wcf DataContracts成员指定默认值?

.net 如何为缺少的wcf DataContracts成员指定默认值?,.net,wcf,datacontract,.net,Wcf,Datacontract,假设我有以下数据契约在客户端和服务器的v1上运行 [DataContract] public class Customer { [DataMember] public string Name; [DataMember] public string LastName; } 现在在本文中,我将服务器更新为DataContract V2的新版本-添加新成员年龄 [DataMember] publi

假设我有以下数据契约在客户端和服务器的v1上运行

[DataContract]
    public class Customer
    {
        [DataMember]
        public string Name;
        [DataMember]
        public string LastName;
    }
现在在本文中,我将服务器更新为DataContract V2的新版本-添加新成员年龄

    [DataMember]
    public int Age = 25;
如上所述,如果客户端未指定成员,则应该将其默认为25

  • ClientV1(旧)调用ServerV2(新)-在这种情况下,客户端不传递新成员。但是,我发现数据成员的值为0(缺少的成员应获得默认值25)
我找到了让它工作的方法。确保DataMember.EmitDefaultValue=True(默认值)


我的问题是为什么字段初始值设定项方法不起作用?

在反序列化过程中没有调用构造函数或字段初始值设定项。我还没有找到关于后者的文档,但是如果您将一个私有字段放在同一个类中,它不是
[DataMember]
,那么您会注意到,这个字段也不会被初始化

我最后使用的一种方法是定义一个方法来设置默认值,并在构造函数中以及从
[OnDeserialization]
方法中调用此方法

例如(请原谅我使用VB.NET,这是我手头的东西)

Public Sub New()
SetDefaults()
端接头
'反序列化发生在反序列化之前
私有子序列化(ByVal c作为StreamingContext)
SetDefaults()
端接头
私有子集合默认值()
Foo=“FooValueV2”
Bar=“BarValueV2”
OnlyInV2=“OnlyInV2值”
仅限V2int=98765
端接头
[DataMember]
        public int Age;

        [OnDeserializing]
        internal void OnDeserializingMethod(StreamingContext context)
        {
            Age = 25;
        }
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