WCF DataMember值类型为EmitDefaultValue? (但我设置自己的默认值)

问题描述:

我有以下几点:WCF DataMember值类型为EmitDefaultValue? (但我设置自己的默认值)

[DataContract] 
public class Foo 
{ 
    [DataMember(EmitDefaultValue = true) 
    public bool Bar { get; set; } 
} 

2个问题:

  1. 真正发生在这里,因为我的布尔真的不能为空,所以如果我发出那么默认值是什么?

  2. 我该如何做到这一点,如果有人通过没有酒吧部分的消息,然后我的服务器将其默认设置为true而不是false?


基本上是不需要我的酒吧成员在SOAP消息进行发送,如果它不是我想要它默认为真,没有虚假。我不确定如何使我的消息大小有效(不需要任何不必要的东西),然后将值设置为我想要的值(如果它不在消息中),我不确定是否合适。

+2

要回答Q1,如下所示拉吉斯拉夫的例子,在价值型“EmitDefaultValue”真的只有道理可空。这意味着SOAP消息将有一个''元素。如果启用了SOAP验证,那么如果值类型不是Nullable,则可能会生成验证错误。对于复杂(对象)类型,这不是问题。 – mdisibio 2011-06-06 15:11:29

+2

为了回答Q2,我认为拉迪斯拉夫的例子是矫枉过正的。当你说'有人通过没有酒吧的消息'时,不要忘记你在消息后面有一个对象模型...所以只需创建一个私人支持字段'bool bar = true',所以如果Bar属性是从未设置,当从SOAP消息构造对象并查询属性时,它将默认为true。 – mdisibio 2011-06-06 15:15:32

+0

这最初也让我困惑......但记住,你并不需要使用'EmitDefaultValueAttribute'。微软甚至表示,它应该只在特定情况下使用。另外,请记住这是Emit(如在产生中),而不是Omit(如在遗漏中)。 – 2011-06-20 18:38:23

EmitDefaultValue默认为true。

您可以尝试使用属性 System.ComponentModel,但我不确定它是否有效。

我刚刚测试了DefaultValue属性,它不起作用。这意味着您不能更改默认值 - 将始终使用数据类型的默认值。

如果你想设置你的Bartrue使用:

[DataContract] 
public class Foo 
{ 
    [DataMember(EmitDefaultValue = false) 
    public bool? Bar { get; set; } 

    [OnDeserialized] 
    private void SetValuesOnDeserialized(StreamingContext context) 
    { 
     if (!Bar.HasValue) 
     { 
      Bar = true; 
     } 
    } 
} 
+0

+1离开这个关于DefaultValue的位,让我颇为头疼。谢谢! – MatrixManAtYrService 2014-10-23 17:28:02