反序列化抽象类的集合

16 浏览
0 Comments

反序列化抽象类的集合

我有一个包含Web API和MVC Web应用程序的解决方案。

我的API有一个实体模型,其中包含一个抽象的父类和几个子类:

public abstract class Person
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}
public class Student : Person
{
    public Address Dormitory { get; set; }
    ... additional fields
}
public class Professor : Person
{
    public Schedule OfficeHours { get; set; }
    ... additional fields
}

我有一个用于获取所有人员的终端点:

[HttpGet]
[ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)]
public async Task GetPersons()
{
    var persons = await _dbContext.Persons.ToListAsync();
    return Ok(persons);
}

这在Entity Framework中运行良好,它返回了一个包含学生和教授及其属性的集合。

我的Web应用程序调用这个API。Web项目有视图模型,在API中与实体模型基本相同。以下是试图调用API并反序列化结果的方法:

public async Task> GetPersons()
{
    var data = await _apiClient.GetStringAsync(_personsUri);
    var response = JsonConvert.DeserializeObject>(data);
    return response;
}

问题是我无法反序列化到我的视图模型,我收到一个异常,说:

JsonSerializationException: 无法创建类型PersonViewModel的实例。该类型是一个接口或抽象类,无法实例化。

如果我从PersonViewModel中删除abstract,它只返回那些对象,并且不包含学生或教授的属性。

有其他方法可以做到这一点吗?

0