Вопрос по c#, xml – XmlSerializer: как десериализовать значение перечисления, которое больше не существует
Я использую 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, Humidity, не является допустимым значением для 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)
{
}
}
}
}
Per комментарии, кажется, некоторая путаница; Вот пример работы как проект Visual Studio 2010. Этот подход представляет собой простой способ синтаксического анализа только одного свойства объекта (все еще используя XmlSerializer для анализа XML).
IXmlSerializable, где вы можете использовать что-то вроде TryParse для перечисления.
Но я согласен с другими авторами, использующими атрибут "Устаревший".