繁体   English   中英

使用xsd.exe生成的类可以为Nulllable值

[英]Nullable value with xsd.exe generated class

我一直在使用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;
    }
}

目前它的工作原理应该如此。 我正在使用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;
    }
}

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

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

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

private bool balanceFieldSpecified;

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

这提供了我需要的功能。

如果有一种优雅的方式可以使用可空的话,我会暂时搁置这个问题吗? 键入而不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM