I am trying to figure out how to serialize/deserialize an XML listing to C# that has an optional attribute that is an enumerated type. The following is my C# class:
public class AttributeAssignmentExpressionElement : XACMLElement
{
[XmlAttribute]
public string AttributeId { get; set; }
[XmlAttribute]
public Category Category { get; set; }
}
My Category
enumeration is defined as follows:
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
}
When Category
is present in the corresponding XML file, serialization/deserialization works as expected. However if the Category
is missing from the XML, the default value is used (first item in the enumeration). If I try to make the enumerated variable nullable (Category?
), the deserializer throws an exception because it is unable to deserialize a complex type. Given the following XML (which does not contain the attribute), how can I serialize the enumeration appropriately?
<AttributeAssignmentExpression
AttributeId="urn:oasis:names:tc:xacml:3.0:example:attribute:text">
</AttributeAssignmentExpression>
In this situation, the value in the deserialized object should be null.
Thanks for any help you can offer!
Actually, there's some official magic which allows to do this (see here):
That is, the model in TS case should look like this:
Unless you set magic field
CategorySpecified
totrue
,Category
attribute won't be serialized. In case of deserialization,CategorySpecified
will befalse
, indicating thatCategory
wasn't present in XML.The complete sample code using 'Specified' pattern
Well, you can do this - but it is a bit messy:
What this does:
Category?
for the optional enum valueCategory
property for serializationCategorySerialized
, as a proxy toCategory
, which is non-nullable and hidden (as far as is possible) from the IDE etcCategorySerialized
via theShouldSerialize*
pattern