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

标签 c# xml xml-serialization

我正在尝试弄清楚如何将 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/

相关文章:

java - Android 无法识别我的 ID

.net - 如何加快 WCF 客户端的启动性能

c# - 向 Xml 添加新对象

Java XML 序列化错误 : Invalid UTF-16 Surrogate detected

c# - 不同语言发展的相对成本研究

c# - 关于在丢包或连接断开时处理 TCP 连接

java - 我的 EditFriendsActivity 中没有出现 ActionBar。我的代码有什么问题?

xml - 在子节点不包含属性的情况下,如何使用 Xpath 定位父节点?

c# - map 控件 : Remove or hide default map layer

c# - 如何避免在两个相似的 WinForms 上重复逻辑?