使用xsd.exe生成类的可空值

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

 

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并且:

  

生成你正在寻找的东西(没有多余...Specified字段和属性):

 private System.Nullable portField; [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] public System.Nullable 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; } } 

这提供了我需要的function。

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