2010-08-05 31 views
9

Mam zestaw klas budowanych przy użyciu xsd.exe, a ja próbuję je serializować. Jednak atrybut nie jest uwzględniany w wynikowym kodzie XML. Oto część schematu, w którym leży problem.XML Serializacja wartości domyślnych opcjonalnych atrybutów

<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 generowane właściwość o nazwie „Wersja” w klasie „widget” i innej nieruchomości zwanej „VersionSpecified”, ale to nie wydaje się, aby wygenerować atrybut kiedy serializowania nawet gdy wartość true:

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

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

I to jest wyliczenie, na których jest oparta:

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

    [XmlEnumAttribute("1.1")] 
    Version_1_1, 
} 

fragment kodu jak na zamówienie

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

Czy ktoś ma jakiekolwiek przemyślenia na temat dlaczego serializacja odmawia wprowadzenia atrybutu?

Odpowiedz

11

To dlatego, że określono domyślną wartość jako "1,1". Serializator nie utworzy elementu/atrybutu, jeśli właściwość jest równa wartości domyślnej.

+0

Dobry połów. Tęsknie za tym. –

+1

Czy wiesz, że istnieje jakiś sposób zmuszenia go do serializowania opcjonalnego atrybutu z wartością domyślną, gdzie wartość jest jawnie ustawiona w kodzie przed wywołaniem serializacji, jak w przykładzie w pytaniu? – Zack

0

Musisz ustawić flagę VersionSpecified na true przed serializacją. W ten sposób wie, czy opcjonalny atrybut ma być serializowany.

+0

Cześć John, robiąc to dokładnie przed serializacją. Nie ma nic szczególnego, co muszę zrobić z serializatorem, prawda? – Jason

+0

Pokaż kod, którego używasz do serializacji, i nie, nie powinieneś robić nic specjalnego. –

+0

Dodał fragment kodu do dołu, zgodnie z żądaniem. – Jason