C# 可选属性默认值的XML序列化
我有一组使用xsd.exe构建的类,我正在尝试序列化它们。但是,结果XML中没有包含属性。这是问题所在的模式的一部分C# 可选属性默认值的XML序列化,c#,.net,serialization,xml-serialization,xsd.exe,C#,.net,Serialization,Xml Serialization,Xsd.exe,我有一组使用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: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>
这是它所基于的枚举:
/// <remarks/>
[GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[Serializable]
public enum Version
{
[XmlEnumAttribute("1.0")]
Version_1_0,
[XmlEnumAttribute("1.1")]
Version_1_1,
}
有人知道为什么序列化拒绝引入属性吗?在序列化之前,必须将VersionSpecified标志设置为true。这就是它知道是否要序列化此可选属性的方式。这是因为您将默认值指定为“1.1”。当属性等于其默认值时,serialiser不会创建元素/属性。Hi John,在序列化之前正是这样做的。我不需要对序列化程序本身做什么特殊的事情,是吗?请显示用于序列化的代码,不,您不需要做任何其他特殊的事情。您知道是否有任何方法可以强制它用默认值序列化可选属性,其中值在调用serialize之前在代码中显式设置,就像问题中的例子一样?
/// <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);