枚举值'';对于类型>;无效';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

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

我也遇到了同样的问题。使用使枚举字段可以为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; }