Как можно разрешить полиморфное использование типов Array в десериализации .NET XML?

Пример схемы:

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

Запуск этого через .NET-s wsdl.exe генерирует код, подобный следующему:

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

Похоже, что wsdl.exe пытается быть "умным" и понимаю, что мой ArrayOfDog на самом деле является просто типом-оберткой, который может быть закодирован в виде массива C #. Это прекрасно работает, когда на ArrayOfDog явно ссылаются в другом типе данных. Однако, когда ArrayOfDog используется полиморфно (например, в качестве замены xsd: anyType), это нарушается. Кажется, он сломался, потому что среда выполнения .NET ничего не знает о complexType с именем & quot; ArrayOfDog & quot; - он в основном отбросил эту информацию в пользу только использования собственных массивов C #.

Пример XML-документа 1:

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

Пример XML-документа 2:

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

Документ № 1 правильно десериализован во время выполнения. Я получаю объект типа Foo с правильно десериализованными полями для Bar и Baz.

Документ № 2 десериализованincorrectly по времени выполнения. Я получаю объект типа Foo с правильно десериализованным полем для Bar, но для поля Baz я получаю System.XML.XMLNode []. Я предполагаю, что среда выполнения ничего не знает ни о каком типе привязки для сущности с именем & quot; ArrayOfDog & quot ;. Вы можете подумать, что директива XmlInclude & quot; XmlIncludeAttribute (typeof (Dog [])) & quot; справится с этим, но, похоже, он не работает.

Кто-нибудь сталкивался с этим?

Здесь есть элегантное решение? Обходной путь, который я собираюсь использовать, заключается в том, чтобы обернуть мой «ArrayOf»; введите другой тип и включите его в подстановку для xsd: anyType.

Ответы на вопрос(2)

Ваш ответ на вопрос