2009-09-14 67 views
10

我一直在使用xsd.exe来生成将XML反序列化到的类。 我有不需要在源XSD十进制值:xsd.exe生成的类可为空的值

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

回答

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; 
    } 
} 
+5

只适用于元素,不适用于最初问题的属性。 – 2013-07-10 09:17:30

2

我刚刚注意到,它实际上包含下面的代码:

private bool balanceFieldSpecified; 

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

它提供的功能我需要。

我会留下一段时间的问题,以防万一有一个优雅的方式来使用可为空?改为输入。

+6

不幸的是,XSD.EXE约为在.NET框架中存在可空类型之前,所以他们必须想出一个可以在任何情况下都能正常工作的解决方案。我不知道有什么办法可以告诉xsd.exe使用可空类型,而不是.....(有人应该加强并在某天创建一个有用的替代xsd.exe!:-)) – 2009-09-14 12:06:05

+0

存在类似的kludge对于xsd.exe生成的DataSets,除了代替属性外,该行将包含一个'IsBalanceNull()'方法。 – 2009-12-11 19:08:49

+0

@marc_s xsd2code正在尝试提供该功能。 – 2012-12-06 09:13:16

5

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

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

相关问题