反序列化枚举

我有一个xml,其中一个元素的属性可以为空。 例如,

  .....   

现在,语言是从模式创建的类中的枚举类型。 如果指定了语言,它可以正常工作,如果它是空白则无法反序列化(如示例所示)。

编辑:反序列化的代码:

 XmlSerializer xmlserializer = new XmlSerializer(type); StringReader strreader = new StringReader(stringXML); Object o = serializer.Deserialize(strreader); 

我该如何处理这种情况

您可以将枚举属性声明为可为空:

 public Language? Language { get; set; } 


编辑:好吧,我刚试过,它不适用于属性…这是另一个选项:不要直接序列化/反序列化这个属性,而是序列化一个字符串属性:

 [XmlIgnore] public Language Language { get; set; } [XmlAttribute("Language")] public string LanguageAsString { get { return Language.ToString(); } set { if (string.IsNullOrEmpty(value)) { Language = default(Language); } else { Language = (Language)Enum.Parse(typeof(Language), value); } } } 

您可能需要标记枚举,并添加表示未知的默认项。

例如:

 Public Enum EmployeeStatus  Unknown = 0  One = 1  Two = 2  Three = 3 End Enum 

有关更多信息,请参阅此处 。

你可以这样做:

 namespace Example { public enum Language { [XmlEnum("en")] English, [XmlEnum("de")] Deutsch } public class ExampleClass { private Language? language; [XmlAttribute("Language")] public Language Language { get { return language ?? Example.Language.English; } set { language = value; } } . . . } } 

你想要的结果是什么?

由于枚举是不可为空的值类型,因此无法将空值映射到空引用。

 object wontBeNull = couldBeNull ?? defaultIfNull; 

是我试试的。 它被称为Null-Coalescing运算符 ,当我想要一个null输入的默认值时,我会使用它。