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

注:このメソッドContent.ReadAsAsync<...>()は ASP.NET Web API RC にはありません。ベータ版を使用していますか?

于 2012-08-01T06:08:11.623 に答える
1

シリアライザーは、オブジェクト グラフを再ハイドレートするときにどの具象クラスをインスタンス化するかわからないため、インターフェイスを含むオブジェクト グラフを逆シリアル化できません。

于 2012-08-01T03:25:34.017 に答える