【问题标题】:XML Serialization of the default values of optional attributes可选属性默认值的 XML 序列化
【发布时间】:2011-03-25 14:27:52
【问题描述】:

我有一组使用 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”类上生成了一个名为“Version”的属性和另一个名为“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,
}

根据要求编码 sn-p

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);

有人对为什么序列化拒绝引入属性有任何想法吗?

【问题讨论】:

    标签: c# .net serialization xml-serialization xsd.exe


    【解决方案1】:

    这是因为您将默认值指定为“1.1”。当属性等于其默认值时,序列化程序将不会创建元素/属性。

    【讨论】:

    • 您知道是否有任何方法可以强制它使用默认值序列化可选属性,其中该值在调用序列化之前在代码中显式设置,就像问题中的示例一样?
    【解决方案2】:

    您必须在序列化之前将 VersionSpecified 标志设置为 true。这就是它知道是否要序列化这个可选属性的方式。

    【讨论】:

    • 嗨,John,在序列化之前正是这样做的。我不需要对序列化程序本身做任何特别的事情,是吗?
    • 请显示您用于序列化的代码,不,您不应该做任何其他特殊的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多