[英]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.