Как можно разрешить полиморфное использование типов 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.