如何避免异常反序列化无效的枚举项?

Ela*_*lan 5 c# serialization xml-serialization xml-deserialization deserialization

为简单起见,我将使用水果显示我的示例代码.实际上我正在做一些更有意义的事情(我们希望).假设我们有一个枚举:

public enum FruitType
{
    Apple,
    Orange,
    Banana
}
Run Code Online (Sandbox Code Playgroud)

一节课:

[Serializable]
public class Fruit
{
    public FruitType FruitType { get; set; }
    public Fruit(FruitType type)
    {
        this.FruitType = type;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以对它进行序列化和反序列化.现在,让我们修改枚举,现在它是:

public enum FruitType
{
    GreenApple,
    RedApple,
    Orange,
    Banana
}
Run Code Online (Sandbox Code Playgroud)

反序列化以前序列化的对象时,会出现System.InvalidOperation异常,因为Apple(原始枚举项)无效.该对象不会被反序列化.

我能够解决这个问题的一种方法是在序列化时为类中的FruitType属性赋予Fruit不同的名称,如下所示:

    [XmlElement(ElementName = "Mode")]
    public FruitType FruitType { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在,在反序列化期间,旧属性将被忽略,因为找不到它.我想知道是否有一种方法可以在反序列化期间忽略/跳过无效的枚举项,这样就不会抛出异常并且对象仍然会被反序列化.

Dan*_*ite 3

留下Apple并用 标记它ObsoleteAttribute。这样,任何使用的代码Apple都会生成编译器警告。