Ich verwende das .NET XSD.EXE-Importer, um C# -Klassen aus einer Sammlung von XSD-Dateien zu generieren. Als ich versuchte, eine der Klassen in XML zu serialisieren, scheiterte es (InvalidOperationException), und als ich mich darin vertiefte, entdeckte ich, dass eine der erstellten Klassen falsch zu sein scheint..NET xsd-Importer erstellt unserializable-Klasse
Hier ist die 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 C# -Code daraus generiert:
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 machte Warnings
ein Array aus einer Anordnung von WarningType
. Wenn ich die XML serialisiert werden versuchen, erhalte ich eine InvalidOperationException
Ausnahme:
- Es kann keine temporäre Klasse (Ergebnis = 1) erzeugen.
- CS0030 Fehler: kann nicht Typ konvertieren 'WarningType []' auf 'WarningType'
- Fehler CS0030: konvertieren kann nicht Typ 'WarningType []' auf 'WarningType'
- CS0029 Fehler: convert nicht implizit Typ Kann 'WarningType' zu ‚WarningType []‘
- Fehler CS0029: Kann nicht implizit Typ umwandeln ‚WarningType‘ auf ‚WarningType []‘
Aber wenn ich den generierten Code WarningType[][]
-WarningType[]
dann ändern serialisiert es in Ordnung.
Kurz der Bearbeitung der generierten C# -Klasse, wann immer ich dies regeneriere (was hoffentlich weniger häufig vorwärts geht), gibt es eine andere Lösung? Ist das ein Fehler in xsd.exe oder ist die XSD-Datei falsch? Vielleicht gibt es ein Problem im XmlSerializer?
Was ich will ist C# -Code, der korrekt in XML serialisiert, die gegen die XSD validiert. Im Moment scheint das gezackte Array falsch zu sein, denn wenn ich es entferne, erzeugt es das XML.
ich Visual Studio 2008.
Ich glaube, das ist ein bekannter Fehler, der nicht behoben wird. Siehe https://connect.microsoft.com/VisualStudio/feedback/details/362727/xsd-exe-incorrect-class-generated-for-abstract-type-with-derived-types für einen anderen XSD-Bug, von dem sie sagen, dass es nicht sein wird Fest. –
@John Saunders - Bugger, das ist, was ich dachte. Gibt es eine gute Alternative zu XSD.exe, die Sie kennen? –
Das Problem besteht immer noch in .NET 4.5.1 – yW0K5o