我一直在使用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;
}
}
答案 0 :(得分:9)
目前它的工作原理应该如此。我正在使用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;
}
}
答案 1 :(得分:5)
我相信如果在XML架构定义中添加 nillable =“true”,XSD将为该元素创建一个可为空的类型。无论如何,这可能是一个好主意,因为你暗示这个值确实是可以为零的,这将使你的模式定义在这方面更加明确。
不幸的是,在这种情况下,它仍然包含相应的“指定”字段。如果希望序列化程序直接服从可空值,则需要从生成的代码中手动删除“xxSpecified”列。
答案 2 :(得分:2)
我刚刚注意到它实际上包含了以下代码:
private bool balanceFieldSpecified;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool BalanceSpecified {
get {
return this.balanceFieldSpecified;
}
set {
this.balanceFieldSpecified = value;
}
}
它提供了我需要的功能。
如果有一种优雅的方式可以使用可空的话,我会暂时搁置这个问题吗?改为输入。