Wie kann ich in der .NET XML-Deserialisierung die polymorphe Verwendung von Array-Typen zulassen?

Beispiel Schema:

<code><complexType name="Dog">...</complexType>
<complexType name="Cat">...</complexType>

<complexType name="ArrayOfDog">
    <sequence>
        <element name="Dog" type="tns:Dog minOccurs="0" maxOccurs="unbounded" />
    </sequence>
</complexType>

<complexType name="Foo">
    <sequence>
        <element name="Bar" type="string"/>          
        <element name="Baz" type="anyType"/>
    </sequence>
</complexType>
</code>

Wenn Sie dies über die Datei wsdl.exe in .NET ausführen, wird ein Code ähnlich dem folgenden generiert:

<code>[System.Xml.Serialization.XmlIncludeAttribute(typeof(Dog[]))]

public partial class Dog { ... }

public partial class Cat { ... }

public partial class Foo {
    private string barField;
    private object bazField;
}
</code>

Es scheint, dass wsdl.exe versucht, "klug" zu sein und erkennt, dass mein ArrayOfDog wirklich nur ein Wrapper-Typ ist, der als C # -Array codiert werden kann. Dies funktioniert einwandfrei, wenn in einem anderen Datentyp explizit auf ArrayOfDog verwiesen wird. Wenn ArrayOfDog jedoch polymorph verwendet wird (z. B. als Ersatz für xsd: anyType), bricht dies ab. Es scheint zu brechen, weil die .NET-Laufzeit nichts über den complexType mit dem Namen "ArrayOfDog" weiß - im Grunde hat sie diese Informationen weggeworfen, um nur native C # -Arrays zu verwenden.

Beispiel XML-Dokument 1:

<code><Foo>
    <Bar>Hello</Bar>
    <Baz xsi:type="Cat">
        ...
    </Baz>
</Foo>
</code>

Beispiel XML-Dokument 2:

<code><Foo>
    <Bar>Hello</Bar>
    <Baz xsi:type="ArrayOfDog">
        <Dog>...</Dog>
        <Dog>...</Dog>
    </Baz>
</Foo>
</code>

Dokument 1 wird von der Laufzeit korrekt deserialisiert. Ich erhalte ein Objekt vom Typ Foo mit korrekt deserialisierten Feldern für Bar und Baz.

Dokument 2 wird deserialisiertfalsch zur Laufzeit. Ich erhalte ein Objekt vom Typ Foo mit einem korrekt deserialisierten Feld für Bar, aber für das Feld Baz erhalte ich System.XML.XMLNode []. Ich vermute, weil die Laufzeit keine Typbindung für eine Entität mit dem Namen "ArrayOfDog" kennt. Sie könnten denken, dass die XmlInclude-Direktive "XmlIncludeAttribute (typeof (Dog []))" damit umgehen würde, aber es scheint nicht zu funktionieren.

Ist jemand darauf gestoßen?

Gibt es hier eine elegante Lösung? Die Problemumgehung, die ich verwenden möchte, besteht darin, meinen "ArrayOf" -Typ in einen anderen Typ zu verpacken und diesen in die Ersetzung für xsd: anyType aufzunehmen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage