Estoy usando el importador .NET XSD.EXE para generar clases C# de una colección de archivos XSD. Cuando traté de serializar una de las clases en XML falló (InvalidOperationException), y cuando busqué en ella, descubrí que una de las clases creadas parece estar equivocada..NET xsd importador crea la clase no serializable
Este es el código 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>
Y aquí es el código C# generada a partir de ella:
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;
}
}
}
Se hizo Warnings
una matriz de un conjunto de WarningType
. Cuando intento para serializar a XML que obtengo una excepción InvalidOperationException
:
- No se puede generar una clase temporal (resultado = 1).
- CS0030 de error: No se puede convertir tipo 'WarningType []' a 'WarningType' CS0030
- de error: No se puede convertir tipo 'WarningType []' a 'WarningType' CS0029
- de error: No se puede convertir implícitamente el tipo 'WarningType' a 'WarningType []'
- error CS0029: no se puede convertir implícitamente el tipo 'WarningType' a 'WarningType []'
Pero si cambio el código generado a partir de WarningType[][]
a WarningType[]
entonces se serializa bien.
A falta de editar la clase C# generada cada vez que regenere esto (que con suerte será menos frecuente en el futuro), ¿hay alguna otra solución? ¿Es esto un error en xsd.exe o el archivo XSD es incorrecto? Tal vez hay un problema en el XmlSerializer?
Lo que quiero es un código de C# que serializa correctamente a XML que valida contra el XSD. En este momento, la matriz dentada parece estar equivocada porque si la elimino, genera el XML.
Estoy utilizando Visual Studio 2008.
Creo que este es un error conocido que no se solucionará. Consulte https://connect.microsoft.com/VisualStudio/feedback/details/362727/xsd-exe-incorrect-class-generated-for-abstract-type-with-derived-types para otro error de XSD que dicen que no será fijo. –
@ John Saunders - Bugger, eso es lo que pensé. ¿Hay una buena alternativa a XSD.exe que conozcas? –
El problema todavía existe en .NET 4.5.1 – yW0K5o