【发布时间】: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