为什么WCF将空字符串反序列化为有效枚举

时间:2017-01-18 00:57:39

标签: .net xml wcf enums enumeration

比方说,我有一个像这样编写的C#数据合约

[DataContract]
public class GiftCard
{
    [DataMember(IsRequired = true, EmitDefaultValue = false)]
    public PaymentMethod MethodOfPayment;
}

[DataContract]
[Flags]
public enum PaymentMethod
{
    [EnumMember]
    Mastercard = 0,
    [EnumMember]
    Visa = 1
}

然后使用SOAPUI测试它,故意不指定值。

<soapenv:Body>
  <GiftCardTest>
     <GiftCard>
        <MethodOfPayment></MethodOfPayment>
     </GiftCard>
  </GiftCardTest>
</soapenv:Body>

它作为有效Visual Studio Watch

到达我的服务方法

我缺少什么属性?我该如何验证?

2 个答案:

答案 0 :(得分:2)

删除Flags属性就可以了。

[DataContract]
public enum PaymentMethod
{
    [EnumMember]
    Mastercard = 0,
    [EnumMember]
    Visa = 1
}

它现在抛出异常:

  

无效的枚举值&#39;&#39;无法反序列化为类型&#39; PaymentMethod&#39; ...

答案 1 :(得分:0)

当它对值进行去杠杆化时,如果在反序列化期间找不到要使用的有效值,则必须设置默认值。因此它使用default(PaymentMethod),这与执行(PaymentMethod)default(int)相同。

default(int)的值为0,您必须将0设为无效的枚举值或使MethodOfPayment为空,因此默认值为null而不是0。