2013-05-07 2 views
1

Вот упрощение проблемы.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?

ответ

1

Вам не хватает [DataMember] для каждого из свойств ваших классов данных. DataContractSerialiser - это выбор в сериализаторе, то есть вам нужно выбрать для него что-либо с этим свойством.

Измените свои классы таким образом.

[DataContract] 
    [Serializable] 
    [KnownType(typeof(Bar1))] 
    [KnownType(typeof(Bar2))] 
    public class Bar 
    { 
     [DataMember] 
     Public int SomeVal{get;set;} 
    } 

    [DataContract] 
    [Serializable] 
    public class Bar1: Bar 
    { 
     [DataMember] 
     Public int SomeOtherVal{get;set;} 
    } 

    [DataContract] 
    [Serializable] 
    public class Bar2: Bar 
    { 
     [DataMember] 
     Public int YetAnotherOtherVal{get;set;} 
    } 


    I have a second DataContract of Type Foo, which has a public property, List<Bar>. 
    e.g. 
    [DataContract] 
    [Serializable] 
    public class Foo 
    { 
     [DataMember] 
     Public List<Bar> Bars {get;set;} 

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^