2009-09-14 8 views
10

Ich habe xsd.exe verwendet, um eine Klasse zum Deserialisieren von XML zu generieren. Ich habe Dezimalwert in der Quelle XSD, die nicht erforderlich ist:Nullable-Wert mit xsd.exe generierte Klasse

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

Die resultierende Klasse von XSD generiert den folgenden Code ein:

private decimal balanceField; 

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

Was ich beachten nicht NULL sein kann.

Wie stattdessen generieren ich das Feld als NULL-Werte zulassen, wie folgt dargestellt:

private decimal? balanceField; 

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

Antwort

8

Momentan funktioniert es wie es soll. Ich verwende xsd v2.0.50727.42 und:

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

erzeugt genau das, was Sie schon immer gesucht haben (ohne redundante ...Specified Feld und Eigentum):

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

Das funktioniert nur für Elemente, nicht für Attribute wie die ursprünglich gestellte Frage. –

2

Ich habe gerade bemerkt, dass es den folgenden Code tatsächlich aufgenommen hat:

private bool balanceFieldSpecified; 

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

, die die Funktionalität bereitstellt Ich brauche.

Ich lasse die Frage für eine Weile offen für den Fall, dass es eine elegante Möglichkeit gibt, Nullable zu verwenden? Geben Sie stattdessen ein.

+6

Leider xsd.exe war um vor NULL-fähigen Typen, die im .NET-Framework vorhanden sind, mussten sie also eine Lösung entwickeln, die auf jeden Fall funktioniert. Ich bin mir nicht bewusst, dass xsd.exe stattdessen NULL-fähige Typen verwenden könnte ... (jemand sollte aufsteigen und eine nützliche Alternative zu xsd.exe eines Tages erstellen!) –

+0

Ein ähnlicher Kludon existiert Für xsd.exe generierte DataSets, außer dass die Zeile anstelle einer Eigenschaft eine 'IsBalanceNull()' Methode enthält. –

+0

@marc_s xsd2code versucht, diese Funktionalität bereitzustellen. –

5

Ich glaube, wenn Sie nillable = "true" in Ihrer XML-Schemadefinition hinzufügen, erstellt XSD einen Nullable Typ für dieses Element. Dies ist wahrscheinlich eine gute Idee, da Sie implizieren, dass dieser Wert in der Tat nillable ist und dies würde Ihre Schemadefinition in dieser Hinsicht expliziter machen.

Leider enthält es in diesem Fall leider immer noch das entsprechende Feld "Specified". Wenn Sie möchten, dass der Serializer den Nullwert direkt berücksichtigt, müssen Sie die Spalte "xxSpecified" manuell aus dem generierten Code entfernen.

Verwandte Themen