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)
这听起来就像你的数据的值为-1.
枚举只是花哨的整数.您可以为枚举指定任何值(在基础类型的范围内); 例如:
enum Foo { Bar = 1 }
...
Foo foo = (Foo)1035; // perfectly fine
Run Code Online (Sandbox Code Playgroud)
这在c#中很好,但在大多数序列化库中都没有,特别是那些想要将其编码为名称(XmlSerializer,DataContractSerializer等)的序列化库.
因此:如果-1不是枚举的定义值,请不要在数据中使用该值.如果-1有意义,请在枚举中定义它.
| 归档时间: |
|
| 查看次数: |
8813 次 |
| 最近记录: |