2017-02-04 1 views
1

моей модели:WebAPI упорядочивает классы, производные от абстрактного типа правильно при возврате JSON, но не XML

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>(); 
     }  
    } 

мой веб-апи оконечных:

 [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, это возникли проблемы сериализация моих производных классов.

Тип объекта ObjectContent1 не смог сериализовать тело ответа для типа контента 'application/xml; кодировка = UTF-8' .

Тип 'WebApplication1.Models.ChildClass1' с именем контракта данных 'ChildClass1: http://schemas.datacontract.org/2004/07/WebApplication1.Models' не ожидается. Подумайте об использовании DataContractResolver, если вы используете с использованием DataContractSerializer или добавляете любые типы, не известные статически , список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных в сериализатор .

ответ

2

Вы должны добавить KnownType атрибутов Widget класса и указать все возможные типы, которые могут быть переданы в качестве BaseClass экземпляров Contents списка:

[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> 
Смежные вопросы