簡體   English   中英

Exception when serializing polymorphic c# class with method hiding to json, ASP.NET core API

[英]Exception when serializing polymorphic c# class with method hiding to json, ASP.NET core API

為了深入研究這個問題,這里有一個控制台應用程序:

class Program
{
    static void Main()
    {
        Console.WriteLine(JsonSerializer.Serialize(
            new PolyMorphicClass { Data = new SomeData { N = 2} }));
    }
    class BaseClass
    {
        public virtual object Data { get; set; }
    }
    class PolyMorphicClass : BaseClass
    {
        public new SomeData Data { get; set; }
    }
    class SomeData
    {
        public int N { get; set; }
    }
}

此代碼使用以下消息引發無效操作異常:

“ConsoleApp_for_test.Program+PolyMorphicClass.Data”的 JSON 屬性名稱與另一個屬性沖突。

我發現如果我改為初始化BaseClass ,如下所示,它可以工作

static void Main()
{
    Console.WriteLine(JsonSerializer.Serialize(
           new BaseClass { Data = new SomeData { N = 2} }));
}

我的實際問題是:在 WebAPI 中, PolymorphicClass是 controller 操作的響應類型,該操作被序列化為 json,並且會發生同樣的異常。

額外說明:在 API 中,我使用這種多態行為使響應在端點之間保持一致,即相似的數據類型。

我的問題是:在初始化 API 響應的上下文中,可以使用BaseClass而不是上面所說的polymorphicClass嗎? 還有其他解決方案可以序列化嗎? 有人可以解釋為什么會發生異常嗎?

您不能使用new關鍵字更改返回類型,它所做的只是隱藏它並需要使用相同的簽名。

您可以通過多種方式解決此問題。

使用 Generics

用泛型類型替換object將允許您使用Data的特定類型定義PolyMorphicClass ,我相信這與您在此處嘗試執行的操作類似。

class BaseClass<T>
{
    public virtual T Data { get; set; }
}

class PolyMorphicClass : BaseClass<SomeData>
{

}

提供屬性的實現

屬性本質上是 2 種方法(一個 getter 和一個 setter),您可以使用一些默認方法{ get; set; } { get; set; } { get; set; } 這些默認值分別獲取和設置引擎蓋下的私有成員。

virtual屬性基本上是在說“你應該覆蓋我的 getter 和 setter”。 只需指定類型為SomeData的基礎成員即可獲取和設置。 這是一個基本的例子。

class BaseClass
{
    public virtual object Data { get; set; }
}
class PolyMorphicClass : BaseClass
{
    private SomeData data { get; set; }

    public override object Data
    {
        get
        {
            return data;
        }
        set
        {
            data = (SomeData) value;
        }
    }
}

請注意,如果您反序列化一些無法轉換為 SomeData 的SomeData ,您將遇到System.InvalidCastException的運行時異常,因此您可能需要在設置器中添加一些額外的類型檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM