2017-02-04 25 views
1

我的模型類,而不是XML:的WebAPI連載返回JSON時,從抽象類型正確派生

public abstract class BaseClass 
    { 
     public string id { get; set; }  
    } 

    [KnownType(typeof(BaseClass))] 
    public class ChildClass1 : BaseClass 
    { 
     public string shape { get; set; } 
    } 

    [KnownType(typeof(BaseClass))] 
    public class ChildClass2: BaseClass 
    { 
     public string color { get; set; } 
    } 

    public class Widget 
    { 
     public List<BaseClass> Contents { get; set; } 
     public Widget() 
     { 
      Contents = new List<BaseClass>(); 
     }  
    } 

我的Web API端點:

 [HttpGet] 
     public Widget Get() 
     { 
      Widget widget = new Widget(); 
      ChildClass1 cc1 = new ChildClass1(); 
      cc1.id = "1234"; 
      cc1.shape = "round"; 
      ChildClass2 cc2 = new ChildClass2(); 
      cc2.id = "4321"; 
      cc2.color = "red"; 
      widget.Contents.Add(cc1); 
      widget.Contents.Add(cc2); 
      return widget; 
     } 

當請求作爲XML輸出,這是有問題序列化我的派生類。

'ObjectContent`1'類型未能序列化響應正文 內容類型'application/xml;字符集= UTF-8' 。

輸入數據協定名稱爲'WebApplication1.Models.ChildClass1' 'ChildClass1:http://schemas.datacontract.org/2004/07/WebApplication1.Models' 不是預期的。試想,如果你使用的DataContractSerializer是 或添加不是靜態已知 已知類型列表中的任何類型的使用DataContractResolver - 例如,通過使用KnownTypeAttribute 屬性或將它們添加到已知類型傳遞給 串行器的列表。

回答

2

您應該添加KnownType屬性Widget類,並指定這可能爲Contents列表BaseClass情況下傳遞所有可能的類型:

[KnownType(typeof(ChildClass1))] 
[KnownType(typeof(ChildClass2))] 
public class Widget 
{   
    public List<BaseClass> Contents { get; set; } 
    public Widget() 
    { 
     Contents = new List<BaseClass>(); 
    } 
} 

序列化響應:

<Widget xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://schemas.datacontract.org/2004/07/YourNamespace"> 
    <Contents> 
     <BaseClass i:type="ChildClass1"> 
      <id>1234</id> 
      <shape>round</shape> 
     </BaseClass> 
     <BaseClass i:type="ChildClass2"> 
      <id>4321</id> 
      <color>red</color> 
     </BaseClass> 
    </Contents> 
</Widget>