Na deserialização de XML do .NET, como posso permitir o uso polimórfico de tipos de matriz?
Esquema de Exemplo:
<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>
Executar isso através do wsdl.exe do .NET gera um código semelhante ao seguinte:
<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>
Parece que wsdl.exe está tentando ser "inteligente" e perceber que meu ArrayOfDog é realmente apenas um tipo de wrapper que pode ser codificado como uma matriz de C #. Isso funciona bem quando ArrayOfDog é explicitamente referenciado em outro tipo de dados. No entanto, quando ArrayOfDog é usado polimorficamente (por exemplo, como uma substituição para xsd: anyType) isso quebra. Parece quebrar porque o tempo de execução do .NET não sabe nada sobre o complexType chamado "ArrayOfDog" - ele basicamente tem jogado fora essa informação em favor de apenas usar matrizes C # nativas.
Exemplo de documento XML 1:
<code><Foo> <Bar>Hello</Bar> <Baz xsi:type="Cat"> ... </Baz> </Foo> </code>
Exemplo de documento XML 2:
<code><Foo> <Bar>Hello</Bar> <Baz xsi:type="ArrayOfDog"> <Dog>...</Dog> <Dog>...</Dog> </Baz> </Foo> </code>
Documento 1 é desserializado corretamente pelo tempo de execução. Eu recebo um objeto do tipo Foo com campos corretamente desserializados para Bar e Baz.
Documento 2 é desserializadoincorretamente pelo tempo de execução. Eu recebo um objeto do tipo Foo com um campo desserializado corretamente para Bar, mas para o campo Baz recebo System.XML.XMLNode []. Meu palpite é que o tempo de execução não sabe nada sobre qualquer tipo de ligação para uma entidade chamada "ArrayOfDog". Você pode pensar que a diretiva XmlInclude "XmlIncludeAttribute (typeof (Dog []))" manipularia isso, mas parece não estar funcionando.
Alguém já se deparou com isto?
Existe uma solução elegante aqui? A solução que estou pensando em usar é para envolver meu tipo "ArrayOf" em outro tipo e incluí-lo na subsituição para o xsd: anyType.