WCF DataMember值类型为EmitDefaultValue? (但我设置自己的默认值)
问题描述:
我有以下几点:WCF DataMember值类型为EmitDefaultValue? (但我设置自己的默认值)
[DataContract]
public class Foo
{
[DataMember(EmitDefaultValue = true)
public bool Bar { get; set; }
}
2个问题:
真正发生在这里,因为我的布尔真的不能为空,所以如果我发出那么默认值是什么?
我该如何做到这一点,如果有人通过没有酒吧部分的消息,然后我的服务器将其默认设置为true而不是false?
基本上是不需要我的酒吧成员在SOAP消息进行发送,如果它不是我想要它默认为真,没有虚假。我不确定如何使我的消息大小有效(不需要任何不必要的东西),然后将值设置为我想要的值(如果它不在消息中),我不确定是否合适。
答
EmitDefaultValue
默认为true。
您可以尝试使用属性
System.ComponentModel
,但我不确定它是否有效。
我刚刚测试了DefaultValue
属性,它不起作用。这意味着您不能更改默认值 - 将始终使用数据类型的默认值。
如果你想设置你的Bar
到true
使用:
[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
要回答Q1,如下所示拉吉斯拉夫的例子,在价值型“EmitDefaultValue”真的只有道理可空。这意味着SOAP消息将有一个' '元素。如果启用了SOAP验证,那么如果值类型不是Nullable,则可能会生成验证错误。对于复杂(对象)类型,这不是问题。 –
mdisibio
2011-06-06 15:11:29
为了回答Q2,我认为拉迪斯拉夫的例子是矫枉过正的。当你说'有人通过没有酒吧的消息'时,不要忘记你在消息后面有一个对象模型...所以只需创建一个私人支持字段'bool bar = true',所以如果Bar属性是从未设置,当从SOAP消息构造对象并查询属性时,它将默认为true。 – mdisibio 2011-06-06 15:15:32
这最初也让我困惑......但记住,你并不需要使用'EmitDefaultValueAttribute'。微软甚至表示,它应该只在特定情况下使用。另外,请记住这是Emit(如在产生中),而不是Omit(如在遗漏中)。 – 2011-06-20 18:38:23