簡體   English   中英

如何在C#中序列化/反序列化可選XML枚舉?

[英]How to serialize/deserialize optional XML enumeration in C#?

我試圖弄清楚如何將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
}  

當相應的XML文件中存在Category ,序列化/反序列化將按預期方式工作。 但是,如果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等,這是不可為空和隱藏(只要有可能)
  • 通過ShouldSerialize*模式對CategorySerialized使用條件序列化

實際上,有一些官方魔術可以做到這一點( 請參閱此處 ):

另一個選擇是使用特殊的模式來創建XmlSerializer識別的布爾字段,並將XmlIgnoreAttribute應用於該字段。 該模式以propertyNameSpecified的形式創建。 例如,如果存在一個名為“ MyFirstName”的字段,那么您還將創建一個名為“ MyFirstNameSpecified”的字段,該字段指示XmlSerializer是否生成名為“ MyFirstName”的XML元素。 在下面的示例中顯示。

也就是說,TS情況下的模型應如下所示:

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

    [XmlAttribute]
    public Category Category { get; set; }

    [XmlIgnore]
    public bool CategorySpecified { get; set; }                   
}

除非將魔術字段CategorySpecified設置為true ,否則不會對Category屬性進行序列化。 在反序列化的情況下, CategorySpecified將為false ,指示在XML中不存在Category

使用“指定”模式的完整示例代碼

public class ClassToSerialize
{
    [XmlAttribute("attributeName")]
    public EnumType EnumPropertyValue
    {
        get { return EnumProperty.Value; }
        set { EnumProperty = value; }
    }
    [XmlIgnore]
    public EnumType? EnumProperty { get; set; }
    public bool EnumPropertyValueSpecified => EnumProperty.HasValue;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM