Пример схемы:
<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>
Выполнение этого через .NET wsdl.exe создает код, подобный следующему:
[System.Xml.Serialization.XmlIncludeAttribute(typeof(Dog[]))]
public partial class Dog { ... }
public partial class Cat { ... }
public partial class Foo {
private string barField;
private object bazField;
}
Похоже, что wsdl.exe пытается быть "умным" и понимает, что мой ArrayOfDog действительно является просто типом-оберткой, который может быть закодирован как массив C #. Это прекрасно работает, когда на ArrayOfDog явно ссылаются в другом типе данных. Однако, когда ArrayOfDog используется полиморфно (например, в качестве замены xsd: anyType), это нарушается. Кажется, он сломался, потому что среда выполнения .NET ничего не знает о complexType с именем «ArrayOfDog» - она в основном отбросила эту информацию в пользу только использования собственных массивов C #.
Пример XML-документа 1:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="Cat">
...
</Baz>
</Foo>
Пример XML-документа 2:
<Foo>
<Bar>Hello</Bar>
<Baz xsi:type="ArrayOfDog">
<Dog>...</Dog>
<Dog>...</Dog>
</Baz>
</Foo>
Документ № 1 правильно десериализован во время выполнения. Я получаю объект типа Foo с правильно десериализованными полями для Bar и Baz.
Документ № 2 десериализован неправильно во время выполнения. Я получаю объект типа Foo с правильно десериализованным полем для Bar, но для поля Baz я получаю System.XML.XMLNode []. Я думаю, потому что среда выполнения ничего не знает о каких-либо привязках типов для объекта с именем "ArrayOfDog". Вы можете подумать, что директива XmlInclude "XmlIncludeAttribute (typeof (Dog []))" справится с этим, но, похоже, она не работает.
Кто-нибудь сталкивался с этим?
Есть ли здесь элегантное решение? Обходной путь, который я собираюсь использовать, - это обернуть мой тип «ArrayOf» в другой тип и включить его в замену для xsd: anyType.