簡體   English   中英

抽象類的 newtonsoft json 序列化程序

[英]newtonsoft json serializer for Abstract Classes

我下面有一個從抽象類繼承的具體類:

[Serializable]
public class MyConcreteClass : MyAbstractClass
{
    public string MyProperty { get; set; }
}

[Serializable]
public abstract class MyAbstractClass { }

嘗試反序列化 MyconcreteClass 類時,NewtonSoft JSON Serializer 在下面拋出異常:

Newtonsoft.Json.JsonSerializationException:無法創建 MyAbstractClass 類型的實例。 類型是接口或抽象類,不能被實例化。 小路 ....

做了一些谷歌搜索並在下面找到了這個設置:

var settings = new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                };

如果我使用上面的設置,即 TypeNameHandling.All,錯誤就會消失。

我心中的疑問:

  1. 這是解決此問題的正確方法嗎(並且不確定此選項不是開箱即用的)

  2. 我應該注意此設置的任何性能或負面影響。

謝謝。

1.這是解決此問題的正確方法嗎(並且不確定此選項不是開箱即用的)
我認為這是使用 NewtonSoft JSON 反序列化繼承類的正確方法。 當我們通過設置TypeNameHandling = TypeNameHandling.All進行反序列化時,序列化時將始終包含 .NET 類型名稱。 沒有類型信息,轉換器很難決定哪個類將被反/序列化。

2. 我應該注意此設置的任何性能或負面影響。
正如 Json.NET 文檔中所述,當您的應用程序從外部源反序列化 JSON 時應謹慎使用 TypeNameHandling,並且在使用 TypeNameHandling.None 以外的值反序列化時,您應該創建自定義 SerializationBinder。
您可以參考以下鏈接http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_TypeNameHandling.htm https://mallibone.com/post/serialize-object-inheritance-with-json.net

暫無
暫無

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

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