Я пишу службу WCF, которая использует XmlSerializer. Служба представляет собой реализацию на основе WSDL и XSD, которая была предоставлена мне из группы, которая будет использовать эту услугу. В основном это адаптер данных между их системой и моей.Укажите xsi: type для свойства массива
Один конкретный класс обладает свойством, которое представляет собой массив другого ссылочного типа, определенного в проекте. Мне нужно указать xsi:type
для этого свойства.
Я использовал svcutil для генерации кода из WSDL и XSD, а затем «исправил» полученный код в нескольких местах. Это свойство, которое я должен был исправить.
Определение класса (обрезаны вниз только в проблемной области):
[GeneratedCode("svcutil", "4.6.1055.0")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategory("code")]
[XmlType(Namespace = "urn:example.com:types")]
public class userData
{
private ItemType[] itemTypeField;
[XmlArray(Order = 0, Namespace = "urn:example.com:types")]
[XmlArrayItem("item", IsNullable = false, Type = typeof(ItemType), Namespace = "urn:example.com:types")]
public ItemType[] myprop
{
get { return itemTypeField; }
set { itemTypeField = value; }
}
}
XML, который производится при вызове метода обслуживания является (userData
является свойством getUserResponse
класса):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<getUserResponse xmlns="urn:example.com:types">
<userData>
<myprop>
<item>
<key>some key</key>
<value>some value</value>
</item>
<item>
<key>some other key</key>
<value>some other value</value>
</item>
</myprop>
</userData>
</getUserResponse>
</s:Body>
</s:Envelope>
Мне нужен <myprop>
элемент выглядеть следующим образом:
<myprop xsi:type="ns1:MapType"
xmlns:ns1="urn:example.com:types"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Как я могу заставить XmlSerializer генерировать xsi:type
для свойства массива myprop
?
Я нашел эти же вопросы, что и ближе всего к моей проблеме, но они не относятся к массивам:
xsi type and xsd tag
How can I force the use of an xsi:type attribute?
Мне нужно сделать это с помощью настраиваемого сериализатором ли?
Пожалуйста, дайте мне знать, если мне нужно будет опубликовать любой контракт на обслуживание. Все остальное в сервисе работает очень хорошо, это просто немного.