17

我一直在使用 xsd.exe 生成一个用于将 XML 反序列化为的类。我在源 xsd 中有不需要的十进制值:

<xs:attribute name="Balance" type="xs:decimal" use="optional" />

xsd 生成的类生成以下代码:

private decimal balanceField;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal Balance {
    get {
        return this.balanceField;
    }
    set {
        this.balanceField = value;
    }
}

我注意到这是不可为空的。

如何改为将字段生成为可为空,如下所示:

private decimal? balanceField;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal? Balance {
    get {
        return this.balanceField;
    }
    set {
        this.balanceField = value;
    }
}
4

3 回答 3

8

目前它可以正常工作。我正在使用 xsd v2.0.50727.42 并且:

<xs:element name="Port" type="xs:int" nillable="true" />

生成您一直在寻找的内容(没有多余...Specified的字段和属性):

private System.Nullable<int> portField;

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
public System.Nullable<int> Port {
    get {
        return this.portField;
    }
    set {
        this.portField = value;
    }
}
于 2013-03-08T09:54:11.003 回答
5

我相信如果您在 XML 模式定义中添加nillable="true",XSD 将为该元素创建一个可为空的类型。无论如何,这可能是一个好主意,因为您暗示该值确实是可空的,这将使您的架构定义在这方面更加明确。

不幸的是,在这种情况下,它仍然包含相应的“指定”字段。如果您希望序列化程序直接遵循可为空的值,则需要从生成的代码中手动删除“xxSpecified”列。

于 2010-06-21T13:46:00.570 回答
3

我刚刚注意到它实际上包含以下代码:

private bool balanceFieldSpecified;

[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool BalanceSpecified {
    get {
        return this.balanceFieldSpecified;
    }
    set {
        this.balanceFieldSpecified = value;
    }
}

它提供了我需要的功能。

如果有一种优雅的方式可以利用可空性,我将把这个问题留一会儿?而是键入。

于 2009-09-14T11:26:01.970 回答