XML-сериализация значений по умолчанию необязательных атрибутов - PullRequest
9 голосов
/ 05 августа 2010

У меня есть набор классов, созданных с использованием xsd.exe, и я пытаюсь их сериализовать.Однако атрибут не включается в итоговый XML.Вот часть схемы, в которой заключается проблема.

<xsd:element name="Widget">
    <xsd:complexType>
        /* sequence removed for brevity */
        <xsd:attribute name="Version" type="Version" use="optional" default="1.1"/>
    </xsd:complexType>
</xsd:element>
<xsd:simpleType name="Version">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="1.0"/>
        <xsd:enumeration value="1.1"/>
    </xsd:restriction>
</xsd:simpleType>

xsd.exe сгенерировал свойство с именем «Version» для класса «Widget» и другое свойство с именем «VersionSpecified», но, похоже, это не создаетатрибут, когда я сериализуюсь, даже когда установлено значение true:

[XmlAttributeAttribute]
[DefaultValueAttribute(Version.Version_1_1)]
public Version Version { get; set; }

[Serialization.XmlIgnoreAttribute]
public bool VersionSpecified { get; set; }

И это перечисление, на котором оно основано:

/// <remarks/>
[GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[Serializable]
public enum Version
{
    [XmlEnumAttribute("1.0")]
    Version_1_0,

    [XmlEnumAttribute("1.1")]
    Version_1_1,
}

Фрагмент кода согласно запросу

Widget widget = new Widget();
widget.Version = Version.Version_1_1;
widget.VersionSpecified = true;    

XmlSerializer serializer = new XmlSerializer(widget.GetType());
serializer.Serialize(/*Memory Stream object*/, widget);

У кого-нибудь есть мысли о том, почему сериализация отказывается вводить атрибут?

Ответы [ 2 ]

11 голосов
/ 26 августа 2010

Это потому, что вы указали значение по умолчанию как "1.1".Сериализатор не будет создавать элемент / атрибут, когда свойство равно его значению по умолчанию.

0 голосов
/ 05 августа 2010

Перед сериализацией необходимо установить флаг VersionSpecified в значение true.Вот как он узнает, должен ли этот необязательный атрибут быть сериализован.

...