Der .NET xsd-Importer erstellt eine unserialisierbare Klasse

Ich benutze das .NETXSD.EXE Importer zum Generieren von C # -Klassen aus einer Sammlung von XSD-Dateien. Als ich versuchte, eine der Klassen nach XML zu serialisieren, schlug dies fehl (InvalidOperationException), und als ich mich darin vertiefte, stellte ich fest, dass eine der erstellten Klassen falsch zu sein scheint.

Hier ist der zugehörige XSD-Code:

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

Und hier ist der daraus generierte C # -Code:

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

Es machteWarnings ein Array eines Arrays vonWarningType. Wenn ich versuche, das zu XML zu serialisieren, erhalte ich einInvalidOperationException Ausnahme:

Temporäre Klasse kann nicht generiert werden (Ergebnis = 1).Fehler CS0030: Typ 'WarningType []' kann nicht in 'WarningType' konvertiert werdenFehler CS0030: Typ 'WarningType []' kann nicht in 'WarningType' konvertiert werdenFehler CS0029: Typ 'WarningType' kann nicht implizit in 'WarningType []' konvertiert werdenFehler CS0029: Typ 'WarningType' kann nicht implizit in 'WarningType []' konvertiert werden

Aber wenn ich den generierten Code von ändereWarningType[][] zuWarningType[] dann serialisiert es gut.

Gibt es eine andere Lösung, als die generierte C # -Klasse bei jeder Neuerstellung zu bearbeiten (was hoffentlich weniger häufig vor sich geht)? Ist dies ein Fehler in xsd.exe oder ist die XSD-Datei falsch? Möglicherweise liegt ein Problem im XmlSerializer vor?

Was ich will ist C # -Code, der korrekt in XML serialisiert wird und anhand der XSD validiert wird. Im Moment scheint das gezackte Array falsch zu sein, denn wenn ich es entferne, wird das XML generiert.

Ich benutze Visual Studio 2008.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage