2

我有以下代码尝试从 Web api 服务获取 Appication 对象。我得到以下异常:

InnerException = {“无法创建BusinessEntities.WEB.IApplicationField 类型的实例。类型是接口或抽象类,无法实例化。路径'_applicationFormsList[0]._listApplicationPage[0]._listField[0]._applicationFieldID',行1,位置 194。"}。

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

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; }
    }
}
4

2 回答 2

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<...>(),您使用的是 beta 版本吗?

于 2012-08-01T06:08:11.623 回答
1

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

于 2012-08-01T03:25:34.017 回答