[英]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
關鍵字更改返回類型,它所做的只是隱藏它並需要使用相同的簽名。
您可以通過多種方式解決此問題。
用泛型類型替換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.