我有以下代码尝试从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; }
}
}
答案 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)
序列化程序无法反序列化包含接口的任何对象图,因为它不知道在重新保护对象图时要实例化的具体类。