Exemple de schéma:En désérialisation XML .NET, comment puis-je autoriser l'utilisation polymorphique des types Array?
<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>
En l'utilisant wsdl.exe de .NET génère un code similaire à ce qui suit:
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Dog[]))]
public partial class Dog { ... }
public partial class Cat { ... }
public partial class Foo {
private string barField;
private object bazField;
}
Il semble que wsdl.exe essaie d'être « intelligent » et se rendre compte que mon ArrayOfDog est vraiment juste un type de wrapper qui peut être encodé comme un tableau C#. Cela fonctionne correctement lorsque ArrayOfDog est explicitement référencé dans un autre type de données. Cependant, lorsque ArrayOfDog est utilisé de façon polymorphe (par exemple, en remplacement de xsd: anyType), cela se brise. Il semble rompre parce que le runtime .NET ne sait rien sur le complexType nommé "ArrayOfDog" - il a fondamentalement jeté cette information en faveur de l'utilisation de tableaux C# natifs.
Document XML Exemple 1:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="Cat">
...
</Baz>
</Foo>
Document XML Exemple 2:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="ArrayOfDog">
<Dog>...</Dog>
<Dog>...</Dog>
</Baz>
</Foo>
Document n ° 1 est désérialisée correctement par le moteur d'exécution. Je reçois un objet de type Foo avec des champs correctement désérialisés pour Bar et Baz.
Le document 2 est désérialisé incorrectement par le runtime. J'obtiens un objet de type Foo avec un champ correctement désérialisé pour Bar, mais pour le champ Baz je reçois System.XML.XMLNode []. Ma conjecture est parce que le temps d'exécution ne sait rien au sujet d'une liaison de type pour une entité appelée "ArrayOfDog". Vous pourriez penser que la directive XmlInclude "XmlIncludeAttribute (typeof (Dog []))" gérera cela, mais cela ne semble pas fonctionner.
Est-ce que quelqu'un est tombé dessus?
Existe-t-il une solution élégante ici? La solution de contournement que je pense utiliser est d'envelopper mon type "ArrayOf" dans un autre type et l'inclure dans la substitution pour le xsd: anyType.
Quel est le contexte ici? Un service Web ASMX? Quel type revient-il? Tapez Foo? Essayez d'utiliser un nom comme "BunchOfDogs" au lieu de "ArrayOfDog", qui est un nom que .NET aurait généré à partir de Dog []. –
L'erreur se produit dans le client C# d'un service Web. Le WSDL pour le service Web est défini manuellement avec des types de données définis comme je l'ai mentionné ci-dessus. Le point de terminaison du service est implémenté à l'aide de Java. – Eric