如何在C#中序列化/反序列化可选的XML枚举?

Roc*_*cta 7 c# xml xml-serialization

我试图弄清楚如何将XML列表序列化/反序列化为C#,它具有枚举类型的可选属性.以下是我的C#类:

public class AttributeAssignmentExpressionElement : XACMLElement
{
    [XmlAttribute]
    public string AttributeId { get; set; }

    [XmlAttribute]
    public Category Category { get; set; }                   
}
Run Code Online (Sandbox Code Playgroud)

我的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
}  
Run Code Online (Sandbox Code Playgroud)

Category相应的XML文件中存在时,序列化/反序列化按预期工作.但是,如果CategoryXML中缺少该值,则使用默认值(枚举中的第一项).如果我尝试使枚举变量为nullable(Category?),则反序列化器会抛出异常,因为它无法反序列化复杂类型.给定以下XML(不包含该属性),如何正确地序列化枚举?

<AttributeAssignmentExpression
    AttributeId="urn:oasis:names:tc:xacml:3.0:example:attribute:text">       
</AttributeAssignmentExpression>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,反序列化对象中的值应为null.

谢谢你尽你所能的帮助!

Mar*_*ell 14

嗯,你可以这样做 - 但它有点乱:

[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;
}
Run Code Online (Sandbox Code Playgroud)

这是做什么的:

  • 使用a Category?作为可选的枚举值
  • 禁用Category序列化的属性
  • 添加一个辅助属性,CategorySerialized作为代理Category,从IDE等不可空和隐藏(尽可能)
  • CategorySerialized通过ShouldSerialize*模式使用条件序列化