У меня есть набор классов, созданных с использованием 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 сгенерировал свойство с именем «Версия» для класса "Widget" и другого свойства, называемого "VersionSpecified", но, по-видимому, этот атрибут не генерирует атрибут, когда я сериализуюсь, даже если задано значение true:
[XmlAttributeAttribute]
[DefaultValueAttribute(Version.Version_1_1)]
public Version Version { get; set; }
[Serialization.XmlIgnoreAttribute]
public bool VersionSpecified { get; set; }
И это перечисление, на котором он основан: согласно запросу
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);
У кого-нибудь есть мысли о том, почему сериализация отказывается вводить атрибут?
Это потому, что вы указали значение по умолчанию "1.1". Сериализатор не будет создавать элемент/атрибут, если свойство равно его значению по умолчанию.
Перед сериализацией необходимо установить флаг VersionSpecified в значение true. Вот как он узнает, нужно ли сериализовать этот необязательный атрибут.