我使用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类。 不幸的是,这并没有抓住这个错误。
如何捕捉和忽略这个错误任何想法(我可以清理的反序列化完成后)。
米奇
您可以标记过时成员
public enum TypeEnum
{
Temperature,
Pressure,
[Obsolete]
Humidity
}
它通常被认为是不好的做法后,您的图书馆已在使用中删除一个枚举成员。 你为什么不留在原地的成员,但随着其标记[Obsolete]
属性,以防止将来使用? 指定ObsoleteAttribute(string,bool)
构造函数的第二个参数为true
,如果显着的成员访问会导致编译时错误。
public enum TypeEnum
{
Temperature,
Pressure,
[Obsolete("It's always sunny in Philadelphia", true)]
Humidity,
}
为了检查反序列化值时,规避错误,你可以比较反对潜在价值: typeEnum == (TypeEnum)2
。
您可以使用属性来改变周围的节点名和隐藏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解析)的简单方法。
您可以实现IXmlSerializable的 ,在那里你可以使用类似的TryParse的枚举。
但我同意使用过时的属性的其他海报。