C# 带有枚举原因的Wcf DataContract类';枚举值'-1';对于“类型”无效;错误
我在尝试通过wcf传递对象时遇到以下异常: 尝试序列化参数时出错。InnerException消息为“枚举值”-1对于类型“Models.SubModels.DamageLocations”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值并用EnumMemberAttribute属性标记。“。有关更多详细信息,请参阅InnerException 它的定义如下:C# 带有枚举原因的Wcf DataContract类';枚举值'-1';对于“类型”无效;错误,c#,wcf,datacontractserializer,C#,Wcf,Datacontractserializer,我在尝试通过wcf传递对象时遇到以下异常: 尝试序列化参数时出错。InnerException消息为“枚举值”-1对于类型“Models.SubModels.DamageLocations”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值并用EnumMemberAttribute属性标记。“。有关更多详细信息,请参阅InnerException 它的定义如下: [DataContract] public class Property {
[DataContract]
public class Property
{
[DataMember]
public PropertyDamage Damage { get; set; }
public Property()
{
this.Damage = new 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
}
编辑2-在ctor中添加枚举的默认值不会更改错误:
public PropertyDamage()
{
this.DamageLocation = DamageLocations.Unknown; //0
}
在试图研究这个问题时,我看到人们得到了一个类似的错误“枚举值“0”无效”,解决方案是在枚举中添加一个0
但我已经有一个0项,错误状态为-1无效
解决这个问题的正确方法是什么
edit3-似乎-1来自post数据,这是来自提交页面的post数据
Damage.DamageLocation=-1
将enum DamageLocations{…}
更改为enum DamageLocations:int
然后重试。听起来您的数据的值为-1
枚举只是一个奇特的整数。可以将任何值指定给枚举(在基础类型的范围内);例如:
enum Foo { Bar = 1 }
...
Foo foo = (Foo)1035; // perfectly fine
这在c#中很好,但在大多数序列化库中却不行,尤其是那些希望将其编码为名称的库(XmlSerializer、DataContractSerializer等)
因此:如果-1不是枚举中定义的值,请不要在数据中使用该值。如果-1有意义,请在枚举中定义它。是传递有效枚举的字段值吗?你能试着在前面和后面添加值吗?它接收到的值是多少?我猜可能有人正在使用-1作为“未知/其他/所有/无/其他东西”@TomislavMarkovski是的,我尝试过设置值。请参见编辑。但也有相同的错误。@MarcGravel在wcf调用点处,枚举的值是-1,正如错误所述,该属性没有在ctor中设置,而是具有默认值。这不应该是0,而不是-1吗?请显示引发异常的代码。当您将return new Property()
放在服务方法中时会发生什么情况?这是默认设置;这应该是完全不可能的difference@Pramod这没什么区别。谢谢。我想你是对的,-1来自一个mvc http post请求。所以现在我想我要确保模型绑定器将-1枚举设置为0。。。这听起来对吗?@asawyer这是否“对”取决于你;如果这就是你想要a-1做的,那么肯定是好的一点!在这里可以找到自定义活页夹的快速编辑,将-1更改为0,并使其正常工作。非常感谢您的时间和帮助,非常感谢。但是在我的例子中,如果我添加一个值为-1的枚举成员,我将得到这个错误<代码>公共枚举损坏位置{[EnumMember]无=-1,[EnumMember]未知=1,[EnumMember]前=2,[EnumMember]后=3}
。那么我该如何处理这种情况呢?