带枚举的Wcf DataContract类导致"'枚举值'-1'对于类型"错误无效

asa*_*yer 3 c# wcf datacontractserializer

我试图通过wcf传递一个对象时遇到以下异常:

尝试序列化参数http://tempuri.org/:item时出错.InnerException消息'Enum value'-1'对于'Models.SubModels.DamageLocations'类型无效,无法序列化.确保必要的枚举值都存在并且都标有EnumMemberAttribute属性,如果该类型具有DataContractAttribute属性.'.有关更多详细信息,请参阅InnerException.

定义如下:

[DataContract]
public class Property
{
    [DataMember]
    public PropertyDamage Damage { get; set; }

    public Property()
    {
        this.Damage = new PropertyDamage();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且PropertyDamage:

[DataContract]
public enum DamageLocations
{
    [EnumMember]
    Unknown=0,
    [EnumMember]
    Front,
    [EnumMember]
    Rear
}

[DataContract]
public class PropertyDamage
{
    [Display(Name="Location of Damage:")]
    [DataMember(IsRequired=true)]
    public DamageLocations DamageLocation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 这也会导致同样的错误:

public enum DamageLocations
{
    Unknown=0,
    Front=1,
    Rear=2
}
Run Code Online (Sandbox Code Playgroud)

编辑2-在ctor中添加枚举的默认值并未更改错误:

    public PropertyDamage()
    {
        this.DamageLocation = DamageLocations.Unknown; //0
    }
Run Code Online (Sandbox Code Playgroud)

试图研究这个问题,我看到人们得到一个类似的错误"Enum value'0'无效",解决方法是在枚举中添加0.

我已经有一个0项,错误状态-1无效.

解决这个问题的正确方法是什么?

edit3 - 看起来-1是来自帖子数据,这是提交页面的帖子数据.

Damage.DamageLocation=-1
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

这听起来就像你的数据的值为-1.

枚举只是花哨的整数.您可以为枚举指定任何值(在基础类型的范围内); 例如:

enum Foo { Bar = 1 }
...
Foo foo = (Foo)1035; // perfectly fine
Run Code Online (Sandbox Code Playgroud)

这在c#中很好,但在大多数序列化库中都没有,特别是那些想要将其编码为名称(XmlSerializer,DataContractSerializer等)的序列化库.

因此:如果-1不是枚举的定义值,请不要在数据中使用该值.如果-1有意义,请在枚举中定义它.