Вот упрощение проблемы.WCF - входящий полиморфный массив (свойство datacontract), который не получает должным образом десериализованного
У меня есть DataContracts Type Bar, Bar1 и Bar2.
[DataContract]
[Serializable]
[KnownType(typeof(Bar1))]
[KnownType(typeof(Bar2))]
public class Bar
{
Public int SomeVal{get;set;}
}
[DataContract]
[Serializable]
public class Bar1: Bar
{
Public int SomeOtherVal{get;set;}
}
[DataContract]
[Serializable]
public class Bar2: Bar
{
Public int YetAnotherOtherVal{get;set;}
}
У меня есть второй DataContract типа Foo, который имеет общедоступное свойство List. , например.
[DataContract]
[Serializable]
public class Foo
{
Public List<Bar> Bars {get;set;}
}
У меня есть ServiceContract (Interface), который имеет 2 метода, которые поддерживают как SOAP, так и JSON.
[ServiceContract]
public interface IFooWorld
{
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[ServiceKnownType(typeof(Bar1))]
[ServiceKnownType(typeof(Bar2))]
Foo GetFoo();
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[ServiceKnownType(typeof(Bar1))]
[ServiceKnownType(typeof(Bar2))]
void SetFoo(Foo foo);
}
Использование SoapUI, я могу подтвердить, что GetFoo возвращает полиморфный массив баров с соединением планкой1 и BAR2 объектов в массиве.
Использование журнала, я узнал, что когда я вызываю SetFoo со смешанным массивом объектов Bar1 и Bar2 в Foo.Bar, Bar сам по себе не является нулевым, но он пуст.
У меня есть параметр Bar в SOAP в различных стилях
Style 1 - это вызвало въездной массив Bar быть выделены, но пустой
<ns:Bars>
<ns:Bar1>...
</ns:Bar1>
<ns:Bar2>...
</ns:Bar2>
</ns:Bars>
Style 2 - это вызвало въездного массив Bar иметь элементы типа Bar, а не Bar1 и Bar2
<ns:Bars>
<ns:Bar i:type="Bar1">...
</ns:Bar>
<ns:Bar i:type="Bar2">...
</ns:Bar>
</ns:Bars>
Ни один из них не работает. Любые предложения о том, как поддерживать полиморфизм такого типа в DataContract для входящих вызовов в SOAP и JSON?