【问题标题】:Wcf DataContract class with enum causes "'Enum value '-1' is invalid for type" error带有枚举的 Wcf DataContract 类导致“'Enum value '-1' is invalid for type”错误
【发布时间】:2012-01-18 16:24:57
【问题描述】:

我在尝试通过 wcf 传递对象时遇到以下异常:

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

定义如下:

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

    public Property()
    {
        this.Damage = new PropertyDamage();
    }
}

还有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; }
}

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

public enum DamageLocations
{
    Unknown=0,
    Front=1,
    Rear=2
}

edit 2-在ctor中为枚举添加默认值并没有改变错误:

    public PropertyDamage()
    {
        this.DamageLocation = DamageLocations.Unknown; //0
    }

试图研究这个问题,我看到人们得到一个类似的错误“Enum value '0' is invalid”,解决方案是在枚举中添加一个 0。

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

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

edit3 - 看起来 -1 来自发布数据,这是提交页面的发布数据。

Damage.DamageLocation=-1

【问题讨论】:

  • 您传递的字段值是否是有效枚举?您可以尝试在 Front 和 Rear 中添加值吗?
  • 它收到的价值是多少?我的猜测是有人使用 -1 作为“未知/其他/全部/无/其他东西”
  • @TomislavMarkovski 是的,我已经尝试设置这些值。见编辑。但同样的错误。
  • @MarcGravell 在 wcf 调用点,枚举的值为 -1 错误状态,该属性未在 ctor 中设置,而是具有默认值。那不应该是0,而不是-1吗?
  • 请显示引发异常的代码。当您简单地将return new Property() 放入您的服务方法时会发生什么?

标签: c# wcf datacontractserializer


【解决方案1】:

听起来很简单,您的数据的值为 -1。

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

enum Foo { Bar = 1 }
...
Foo foo = (Foo)1035; // perfectly fine

这在 c# 中很好,但在大多数序列化库中却不行,尤其是那些想要将其编码为名称的库(XmlSerializer、DataContractSerializer 等)。

所以:如果 -1 不是枚举的 定义 值,请不要在数据中使用该值。如果-1有含义,在枚举中定义。

【讨论】:

  • 我认为你是对的,-1 来自 mvc http post 请求。所以现在我想我要确保模型绑定器将 -1 枚举设置为 0...听起来对吗?
  • @asawyer 是否“正确”取决于您;如果这是你想要 -1 做的,那么确定
  • 好点!快速编辑此处找到的自定义活页夹stackoverflow.com/a/6099687/426894 将 -1 更改为 0 并正常工作。感谢您的时间和帮助,非常感谢。
  • 但在我的情况下,如果我添加一个带有 -1 作为值的枚举成员,我会收到此错误。 public enum DamageLocations { [EnumMember] None=-1, [EnumMember] Unknown=1, [EnumMember] Front=2, [EnumMember] Rear=3 }。那么我该如何处理这种情况呢?
【解决方案2】:

enum DamageLocations{...}改成enum DamageLocations:int然后试试。

【讨论】:

  • 这是默认的;这应该完全没有区别
  • @Pramod 这没什么区别。不过谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2012-06-14
  • 1970-01-01
相关资源
最近更新 更多