En la deserialización .NET XML, ¿cómo puedo permitir el uso polimórfico de los tipos de Array?

Esquema de ejemplo:

<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>

Al ejecutar esto a través de .NET's, wsdl.exe genera un código similar al siguiente:

<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á intentando ser "inteligente" y se da cuenta de que mi ArrayOfDog es realmente un tipo de envoltorio que se puede codificar como una matriz C #. Esto funciona bien cuando se hace referencia explícita a ArrayOfDog en otro tipo de datos. Sin embargo, cuando ArrayOfDog se usa de forma polimórfica (por ejemplo, como una sustitución de xsd: anyType) esto se rompe. Parece que se rompe porque el tiempo de ejecución de .NET no sabe nada sobre el complexType llamado "ArrayOfDog"; básicamente ha descartado esta información en favor de solo usar matrices C # nativas.

Ejemplo de documento XML 1:

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

Ejemplo de documento XML 2:

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

El documento # 1 está deserializado correctamente por el tiempo de ejecución. Obtengo un objeto de tipo Foo con campos correctamente deserializados para Bar y Baz.

El documento # 2 está deserializadoincorrectamente por el tiempo de ejecución. Obtengo un objeto de tipo Foo con un campo deserializado correctamente para Bar, pero para el campo Baz obtengo System.XML.XMLNode []. Mi conjetura es porque el tiempo de ejecución no sabe nada sobre ningún tipo de enlace para una entidad llamada "ArrayOfDog". Podría pensar que la directiva XmlInclude "XmlIncludeAttribute (typeof (Dog []))" manejaría esto, pero no parece estar funcionando.

¿Se ha topado alguien con esto?

¿Hay una solución elegante aquí? La solución que estoy pensando en usar es envolver mi tipo "ArrayOf" en otro tipo e incluirlo en la subsitución de xsd: anyType.

Respuestas a la pregunta(2)

Su respuesta a la pregunta