XmlSerializer的:如何反序列化已经不存在的枚举值(XmlSerializer: How

2019-06-24 16:20发布

我使用XmlSerializer这个类保存到一个文件中。 类有一个字符串和一个枚举,如下所示:

public class IOPoint
{
     string Name {get; set;}
     TypeEnum {get; set;}
}


public enum TypeEnum
{
    Temperature,
    Pressure,
    Humidity,
}

当连载它看起来像这样。

<IOPoint>
  <Name>Relative Humidity</Name>
  <TypeEnum>Humidity</TypeEnum>
</IOPoint>

我已经和序列化,没有任何问题了几个版本的反序列化这个对象。 我不再想支持湿度,所以我从枚举删除它。 然而,从XML反序列化时,因为在TypeEnum场,湿度值,是不是为TypeEnum有效值这导致异常。 这是有道理的,但如何处理呢?

我想要做的就是忽略这个错误。 并留下了一个空值。 我已经试过落实OnUnknownElement XmlDeserilizationEvent类。 不幸的是,这并没有抓住这个错误。

如何捕捉和忽略这个错误任何想法(我可以清理的反序列化完成后)。

米奇

Answer 1:

您可以标记过时成员

public enum TypeEnum
{
    Temperature,
    Pressure,
    [Obsolete]
    Humidity
}


Answer 2:

它通常被认为是不好的做法后,您的图书馆已在使用中删除一个枚举成员。 你为什么不留在原地的成员,但随着其标记[Obsolete]属性,以防止将来使用? 指定ObsoleteAttribute(string,bool)构造函数的第二个参数为true ,如果显着的成员访问会导致编译时错误。

public enum TypeEnum
{
    Temperature,
    Pressure,

    [Obsolete("It's always sunny in Philadelphia", true)]
    Humidity,
}

为了检查反序列化值时,规避错误,你可以比较反对潜在价值: typeEnum == (TypeEnum)2



Answer 3:

您可以使用属性来改变周围的节点名和隐藏XML序列化的元素,手动解析只是一个元素:

public class IOPoint
{
 public string Name {get; set;}

 [XmlIgnore]
 public TypeEnum TypeEnum {get; set;}

 [XmlElement("TypeEnum")]
 public string LegacyTypeEnum 
 {
  get { return this.TypeEnum.ToString(); }
  set 
  { 
   try
   {
    this.TypeEnum = (TypeEnum)Enum.Parse(typeof(TypeEnum),value);
   }
   catch(ArgumentException)
   {
    // Handle "Humidity"
   }
   catch(OverflowException)
   {
   }
  }
 }
}

每评论似乎有些混乱; 这里是一个工作实例作为一个Visual Studio 2010项目。 这种方法的人工分析的对象只有一个属性(仍利用XmlSerializer的做XML解析)的简单方法。



Answer 4:

您可以实现IXmlSerializable的 ,在那里你可以使用类似的TryParse的枚举。

但我同意使用过时的属性的其他海报。



文章来源: XmlSerializer: How to Deserialize an enum value that no longer exists