2010-08-05 20 views
9

Tengo un conjunto de clases compiladas usando xsd.exe, y estoy intentando serializarlas. Sin embargo, un atributo no se está incluyendo en el XML resultante. Aquí hay una parte del esquema donde se encuentra el problema.XML Serialización de los valores predeterminados de los atributos opcionales

<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 genera una propiedad llamada "Versión" en una clase "Widget" y otra propiedad llamada "VersionSpecified", pero esto no parece generar el atributo cuando serializar incluso cuando se define como true:

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

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

Y esta es la enumeración en la que se basa:

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

    [XmlEnumAttribute("1.1")] 
    Version_1_1, 
} 

fragmento de código según la petición

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

¿Alguien tiene alguna idea sobre por qué la serialización se niega a introducir el atributo?

Respuesta

11

Es porque ha especificado el valor predeterminado como "1.1". El serializador no creará el elemento/atributo cuando la propiedad sea igual a su valor predeterminado.

+0

Buena captura. Me lo perdí. –

+1

¿Sabe si hay alguna manera de forzarlo a serializar un atributo opcional con un valor predeterminado, donde el valor se establece explícitamente en el código antes de llamar a serializar, como en el ejemplo de la pregunta? – Zack

0

Debe establecer el indicador VersionSpecified en verdadero antes de la serialización. Así es como sabe si este atributo opcional se serializará o no.

+0

Hola John, haciendo exactamente eso justo antes de la serialización. No hay nada especial que deba hacer con el serializador en sí, ¿verdad? – Jason

+0

Por favor, muestre el código que usa para serializar, y no, no debería tener que hacer nada más especial. –

+0

Se agregó un fragmento de código al final según su solicitud. – Jason

Cuestiones relacionadas