使用DataContractSerializer使用以下成员编写DataContract时:
[DataMember]
public PropertyId PropId { get; set; }
报告序列化错误:
SerializationException:枚举值'8493'对于类型无效 'EnumType'并且无法序列化。确保必要的枚举 值存在并使用EnumMemberAttribute属性标记 如果类型具有DataContractAttribute属性。
是的,C#Enum定义中不存在特定的枚举值,因为PropertyId是动态的,可以在重新编译之间添加到DB(但不删除)。
由于我们不希望仅仅因为添加了属性而需要重新编译代码,除了类型转换和序列化作为Int32之外,是否存在此类问题的解决方法(这是我们从哪里开始但是为了提高类型安全性而改进/可读性)。
我们希望使用相同的概念将类型安全性扩展到更“通用”的ID。例如,说出OrderId之类的东西。将它定义为枚举以在整个C#中获得类型安全性是有利的。实际的枚举值将不存在,因为它们的生命周期与运行时间编译时间相对应。
类似:
9974127/serializing-object-with-invalid-enum-value
8913631/wcf-datacontract-class-with-enum-causes-enum-value-1-is-invalid-for-type-e
答案 0 :(得分:1)
我遇到了与“ 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。遇到了这个问题。
答案 1 :(得分:0)
仍然是一种解决方法但是至少可以在DataContract中隐藏类型转换为Int32,而不是通过线路实际上序列化Enum(没有[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; }
答案 2 :(得分:0)
我也遇到了同样的问题。使Enum字段可以为空?标记
[DataMember]
public PropertyId? PropId { get; set; }