枚举值''对于类型>无效; 'EnumType'并且无法序列化

时间:2014-04-23 01:01:57

标签: c# serialization enums

使用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

3 个答案:

答案 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; }