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.