我有一个xml,其中一个元素的属性可以为空。 例如,
<tests>
<test language="">
.....
</test>
</tests>
现在,语言是从模式创建的类中的枚举类型。如果指定了语言,它可以正常工作,如果它是空白则无法反序列化(如示例所示)。
编辑:反序列化代码:
XmlSerializer xmlserializer = new XmlSerializer(type);
StringReader strreader = new StringReader(stringXML);
Object o = serializer.Deserialize(strreader);
我该如何处理这种情况
答案 0 :(得分:20)
<击> 您可以将枚举属性声明为可为空:
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);
}
}
}
答案 1 :(得分:15)
您可能需要标记枚举,并添加代表未知的默认项目。
例如:
Public Enum EmployeeStatus
<XmlEnum("")> Unknown = 0
<XmlEnum("Single")> One = 1
<XmlEnum("Double")> Two = 2
<XmlEnum("Triple")> Three = 3
End Enum
有关详细信息,请参阅here。
答案 2 :(得分:13)
你可以这样做:
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; }
}
.
.
.
}
}
答案 3 :(得分:2)
你想要的结果是什么?
空值不能映射到空引用,因为枚举是不可为空的值类型。
答案 4 :(得分:0)
object wontBeNull = couldBeNull ?? defaultIfNull;
我会尝试什么。它被称为Null-Coalescing operator,当我想要一个默认的空输入时,我会使用它。