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.

questionAnswers(2)

yourAnswerToTheQuestion