ReadAsAsync - throws Exception Type是一个接口或抽象类,无法实例化

时间:2012-07-31 20:59:11

标签: c# asp.net-web-api

我有以下代码尝试从web api服务获取Appication对象。我得到了以下例外:

  

InnerException = {“无法创建BusinessEntities.WEB.IApplicationField类型的实例.Type是接口或抽象类,无法立即显示.Path'_applicationFormsList [0] ._ listApplicationPage [0] ._ listField [0] ._ applicationFieldID ',第1行,第194位。“}。

我不明白为什么将FieldList更改为接口会导致反序列化对象时出现问题。任何指针都非常感激。

Task<HttpResponseMessage> task = HttpClientDI.GetAsync(someUri);
HttpResponseMessage response = task.Result;

HttpClientHelper.CheckResponseStatusCode(response);

try
{
    Application application = response.Content.ReadAsAsync<ApplicationPage>().Result;
    return application;
}
catch (Exception ex)
{
    throw new ServiceMustReturnApplicationException(response);
}



[Serializable]
public class ApplicationPage
{
    #region Properties
    public int PageOrder { get; set; }
    public string Title { get; set; }
    public string HtmlPage { get; set; }
    public int FormTypeLookupID { get; set; }

    List<IApplicationField> _listField = new List<IApplicationField>(); 
    public List<IApplicationField> FieldList
    {
        get { return _listField; }
        set { _listField = value; }
    }
}

2 个答案:

答案 0 :(得分:2)

您需要为要尝试反序列化的类的所有接口指定具体类,以便在反序列化过程中为这些接口创建实例。

通过这样做,可以通过为json.net创建自定义转换器来获取:

public class ApplicationFieldConverter : CustomCreationConverter<IApplicationField>
{
    public override IApplicationField Create(Type objectType)
    {
        return new FakeApplicationField();
    }
}

你的代码应该是:

string jsonContent= response.Content.ReadAsStringAsync().Result;
Application application = JsonConvert.DeserializeObject<Application>(jsonContent,
                                 new ApplicationFieldConverter());

注意:在ASP.NET Web API RC中找不到方法Content.ReadAsAsync<...>(),您使用的是测试版?

答案 1 :(得分:1)

序列化程序无法反序列化包含接口的任何对象图,因为它不知道在重新保护对象图时要实例化的具体类。