XmlSerializer: How to Deserialize an enum value that no longer exists
You can mark the member Obsolete
public enum TypeEnum{ Temperature, Pressure, [Obsolete] Humidity}
It’s generally considered bad practice to remove an enumeration member after your library is already in use. Why don’t you leave the member in place, but mark it with the [Obsolete]
attribute to prevent future use? Specifying the ObsoleteAttribute(string,bool)
constructor’s second parameter as true
would cause a compile-time error if the marked member is accessed.
public enum TypeEnum{ Temperature, Pressure, [Obsolete("It's always sunny in Philadelphia", true)] Humidity,}
To circumvent the error when checking deserialized values, you could compare against the underlying value: typeEnum == (TypeEnum)2
.
You can use attributes to change node names around and hide elements from xml serialization, parsing just that one element manually:
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 comments there appears to be some confusion; here is a worked example as a Visual Studio 2010 project. This approach is a simple way of manually parsing only one property of an object (still leveraging the XmlSerializer to do the XML parsing).