Sto utilizzando l'importatore .NET XSD.EXE per generare classi C# da una raccolta di file XSD. Quando ho provato a serializzare una delle classi in XML non è riuscito (InvalidOperationException), e quando l'ho scavato ho scoperto che una delle classi create sembra essere sbagliata..NET xsd importatore crea una classe non serializzabile
Ecco il codice XSD pertinente:
<xsd:complexType name="SuccessType">
<xsd:annotation>
<xsd:documentation>Indicates in a response message that a request was successfully processed.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="Warnings" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- .. snip .. -->
<xsd:element name="Warnings" type="WarningsType">
<xsd:annotation>
<xsd:documentation>The processing status of a business message and any related warnings or informational messages.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<!-- .. snip .. -->
<xsd:complexType name="WarningsType">
<xsd:annotation>
<xsd:documentation>A collection of warnings generated by the successful processing of a business message.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="Warning" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- .. snip .. -->
<xsd:element name="Warning" type="WarningType">
<xsd:annotation>
<xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<!-- .. snip .. -->
<xsd:complexType name="WarningType">
<xsd:annotation>
<xsd:documentation>Defines details of a warning that occurred during message processing.</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="WarningCategory"/>
<xsd:element ref="WarningCode"/>
<xsd:element ref="WarningShortMessage"/>
<xsd:element ref="WarningMessage"/>
</xsd:sequence>
</xsd:complexType>
Ed ecco il codice C# generato da esso:
public partial class SuccessType
{
private WarningType[][] warningsField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("Warning", typeof(WarningType), IsNullable = false)]
public WarningType[][] Warnings
{
get
{
return this.warningsField;
}
set
{
this.warningsField = value;
}
}
}
Si fece Warnings
una matrice di una matrice di WarningType
. Quando tento di serializzare che a XML ricevo un'eccezione InvalidOperationException
:
- Impossibile generare una classe temporanea (risultato = 1).
- errore CS0030: Impossibile convertire il tipo 'WarningType []' a 'WarningType'
- errore CS0030: Impossibile convertire il tipo 'WarningType []' a 'WarningType'
- errore CS0029: Impossibile convertire implicitamente il tipo 'WarningType' a 'WarningType []'
- errore CS0029: Impossibile convertire implicitamente il tipo 'WarningType' a 'WarningType []'
Ma se cambio il codice generato WarningType[][]
-WarningType[]
allora serializza bene.
In mancanza di modifica della classe C# generata ogni volta che rigenera questo (che si spera sia meno frequente in avanti), c'è qualche altra soluzione? Si tratta di un bug in xsd.exe o il file XSD è errato? Forse c'è un problema in XmlSerializer?
Quello che voglio è il codice C# che serializza correttamente in XML che viene convalidato rispetto all'XSD. In questo momento l'array frastagliato sembra essere sbagliato perché se lo rimuovo, allora genera l'XML.
Sto usando Visual Studio 2008.
Credo che questo sia un bug noto che non sarà risolto. Vedere https://connect.microsoft.com/VisualStudio/feedback/details/362727/xsd-exe-incorrect-class-generated-for-abstract-type-with-derived-types per un altro bug XSD che dicono non sarà fisso. –
@John Saunders - Bugger, questo è quello che ho capito. C'è una buona alternativa a XSD.exe che conosci? –
Il problema esiste ancora in .NET 4.5.1 – yW0K5o