2010-08-05 5 views
9

J'ai un ensemble de classes construites en utilisant xsd.exe, et j'essaie de les sérialiser. Toutefois, aucun attribut n'est inclus dans le fichier XML résultant. Voici une partie du schéma où le problème réside.XML Sérialisation des valeurs par défaut des attributs optionnels

<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 a généré une propriété appelée « Version » sur une classe « Widget » et une autre propriété appelée « VersionSpecified », mais cela semble ne pas générer l'attribut quand je sérialiser même lorsque la valeur true:

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

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

Et voici l'énumération sur laquelle elle est basée:

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

    [XmlEnumAttribute("1.1")] 
    Version_1_1, 
} 

extrait de code selon la demande

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

Est-ce que quelqu'un a des idées sur pourquoi la sérialisation refuse d'introduire l'attribut?

Répondre

11

C'est parce que vous avez spécifié la valeur par défaut "1.1". Le sérialiseur ne créera pas l'élément/attribut lorsque la propriété est égale à sa valeur par défaut.

+0

Bonne prise. J'ai manqué ça. –

+1

Savez-vous s'il existe un moyen de forcer la sérialisation d'un attribut facultatif avec une valeur par défaut, où la valeur est explicitement définie dans le code avant d'appeler serialize, comme dans l'exemple de la question? – Zack

0

Vous devez définir l'indicateur VersionSpecified sur true avant la sérialisation. C'est ainsi qu'il sait si cet attribut optionnel doit être sérialisé ou non.

+0

Bonjour John, faire exactement cela juste avant la sérialisation. Je n'ai rien de spécial à faire avec le sérialiseur lui-même, n'est-ce pas? – Jason

+0

S'il vous plaît montrer le code que vous utilisez pour la sérialisation, et non, vous ne devriez pas avoir à faire autre chose de spécial. –

+0

Extrait de code ajouté au fond selon votre demande. – Jason

Questions connexes