枚举值'';对于类型>;无效';EnumType';并且无法序列化
本文关键字:EnumType 无效 序列化 gt 类型 于类型 枚举 | 更新日期: 2023-09-27 17:59:30
使用DataContractSerializer与以下成员编写DataContract时:
[DataMember]
public PropertyId PropId { get; set; }
它报告了一个序列化错误:
SerializationException:枚举值"8493"对于类型无效"EnumType",无法序列化。确保必要的枚举值存在并且用EnumMemberAttribute属性标记如果类型具有DataContractAttribute属性。
是的,C#枚举定义中不存在该特定枚举值,因为PropertyId是动态的,可以在重新编译之间添加到DB(但不能删除)。
由于我们不希望仅仅因为添加了一个属性就要求重新编译代码,除了类型转换和作为Int32序列化(这是我们开始的地方,但为了提高类型安全性/可读性)之外,还有什么解决这类问题的方法吗。
我们希望使用相同的概念将类型安全扩展到更"通用"的ID。例如,比如OrderId。将其定义为枚举有一个优点,可以在整个C#中获得类型安全性。实际的枚举值将不存在,因为它们的寿命与运行时相比编译时更为对应。
类似:
9974127/正在序列化枚举值无效的对象
8913631/wcf-datacontract-class-with-enum-causes-enum-value-1-is-invalidd-for-type-e
我也遇到了同样的问题。使用使枚举字段可以为null?做记号
[DataMember]
public PropertyId? PropId { get; set; }
我遇到了与"Dhanuka777"相同的问题。不管是否动态创建枚举。
用属性[EnumMember]标记的枚举值将被设置为与源不同的值。
例如:
// Source
public enum myEnum
{
[EnumMember]
someEnumVal = 99,
}
// --------------------------------------------------------------------- //
// Service Reference code
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="myEnum")]
public enum myEnum : int {
[System.Runtime.Serialization.EnumMemberAttribute()]
someEnumVal = 0,
}
如果您没有显式地设置枚举值,那么您就可以了。如果没有,那么我建议使用"crokusek"解决方法。
顺便说一句,我在.NET版本4.5.2中遇到过这个问题。
这仍然是一个解决方法,但至少可以在DataContract中隐藏到Int32的类型转换,而不是通过连线实际序列化Enum(no[DataMember])。
public PropertyId PropId // Reflect an Int32 backing store to support deserialization of unknown Enum values
{
get { return (PropertyId)_propIdValue; }
set { _propIdValue = (Int32)value; }
}
[DataMember]
private Int32 _propIdValue { get; set; }