2010-08-05 8 views
9

Ich habe eine Reihe von Klassen mit xsd.exe gebaut, und ich versuche, sie zu serialisieren. Ein Attribut wird jedoch nicht in dem resultierenden XML enthalten. Hier ist ein Teil des Schemas, in dem das Problem liegt.XML Serialisierung der Standardwerte der optionalen Attribute

<xsd:element name="Widget"> 
    <xsd:complexType> 
     /* sequence removed for brevity */ 
     <xsd:attribute name="Version" type="Version" use="optional" default="1.1"/> 
    </xsd:complexType> 
</xsd:element> 
<xsd:simpleType name="Version"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="1.0"/> 
     <xsd:enumeration value="1.1"/> 
    </xsd:restriction> 
</xsd:simpleType> 

xsd.exe erzeugt eine Eigenschaft namens „Version“ auf „Widget“ Klasse und eine andere Eigenschaft namens „VersionSpecified“, aber dies scheint nicht das Attribut zu erzeugen, wenn ich selbst serialisiert werden, wenn auf true gesetzt:

[XmlAttributeAttribute] 
[DefaultValueAttribute(Version.Version_1_1)] 
public Version Version { get; set; } 

[Serialization.XmlIgnoreAttribute] 
public bool VersionSpecified { get; set; } 

Und das ist die Aufzählung, auf dem es basiert:

/// <remarks/> 
[GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[Serializable] 
public enum Version 
{ 
    [XmlEnumAttribute("1.0")] 
    Version_1_0, 

    [XmlEnumAttribute("1.1")] 
    Version_1_1, 
} 

-Code-Schnipsel wie pro Antrag

Widget widget = new Widget(); 
widget.Version = Version.Version_1_1; 
widget.VersionSpecified = true;  

XmlSerializer serializer = new XmlSerializer(widget.GetType()); 
serializer.Serialize(/*Memory Stream object*/, widget); 

Hat jemand irgendwelche Gedanken darüber, warum die Serialisierung die Einführung des Attributs verweigert?

Antwort

11

Dies ist, weil Sie den Standardwert als "1.1" angegeben haben. Der Serialiser erstellt das Element/Attribut nicht, wenn die Eigenschaft dem Standardwert entspricht.

+0

Guter Fang. Das habe ich vermisst. –

+1

Weißt du, ob es eine Möglichkeit gibt, sie zu zwingen, ein optionales Attribut mit einem Standardwert zu serialisieren, wobei der Wert vor dem Aufruf von serialize explizit im Code gesetzt wird, wie im Beispiel in der Frage? – Zack

0

Sie müssen das VersionSpecified-Flag vor dem Serialisieren auf "True" setzen. So weiß es, ob dieses optionale Attribut serialisiert werden soll oder nicht.

+0

Hallo John, genau das gerade vor dem Serialisieren. Es gibt nichts besonderes, das ich mit dem Serialisierer selbst machen muss, oder? – Jason

+0

Bitte zeigen Sie den Code, den Sie für die Serialisierung verwenden, und nein, Sie sollten nichts besonderes tun müssen. –

+0

Code-Snippet nach Ihrer Anfrage hinzugefügt. – Jason