我正在尝试弄清楚如何将 XML 列表序列化/反序列化为 C#,它具有一个可选属性,该属性是一个枚举类型。以下是我的 C# 类:
public class AttributeAssignmentExpressionElement : XACMLElement
{
[XmlAttribute]
public string AttributeId { get; set; }
[XmlAttribute]
public Category Category { get; set; }
}
我的Category
枚举定义如下:
public enum Category
{
[XmlEnum(Name = "urn:oasis:names:tc:xacml:1.0:subject-category:access-subject")]
Subject,
[XmlEnum(Name = "urn:oasis:names:tc:xacml:3.0:attribute-category:resource")]
Resource,
[XmlEnum(Name = "urn:oasis:names:tc:xacml:3.0:attribute-category:action")]
Action,
[XmlEnum(Name = "urn:oasis:names:tc:xacml:3.0:attribute-category:environment")]
Environment
}
当 Category
出现在相应的 XML 文件中时,序列化/反序列化将按预期进行。但是,如果 XML 中缺少 Category
,则使用默认值(枚举中的第一项)。如果我尝试使枚举变量可为空 (Category?
),反序列化器将抛出异常,因为它无法反序列化复杂类型。给定以下 XML(不包含该属性),我如何才能适本地序列化枚举?
<AttributeAssignmentExpression
AttributeId="urn:oasis:names:tc:xacml:3.0:example:attribute:text">
</AttributeAssignmentExpression>
在这种情况下,反序列化对象中的值应该为null。
感谢您提供的任何帮助!
最佳答案
好吧,你可以这样做 - 但它有点困惑:
[XmlIgnore]
public Category? Category { get; set; }
[XmlAttribute("Category")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public Category CategorySerialized
{
get { return Category.Value; }
set { Category = value; }
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeCategorySerialized()
{
return Category.HasValue;
}
这是做什么的:
- 使用
Category?
对于可选的枚举值 - 禁用
Category
序列化属性 - 添加第二个属性,
CategorySerialized
, 作为Category
的代理,它是不可空的,并且(尽可能地)从 IDE 等中隐藏 - 在
CategorySerialized
上使用条件序列化通过ShouldSerialize*
模式
关于c# - 如何在 C# 中序列化/反序列化可选的 XML 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840197/