2017-01-23 232 views
0

我有下面從抽象類繼承的具體類:試圖去當newtonsoft JSON序列化的抽象類

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

[Serializable] 
public abstract class MyAbstractClass { } 

NewtonSoft JSON序列拋出異常以下/串行MyconcreteClass類:

Newtonsoft.Json.JsonSerializationException:無法創建類型爲MyAbstractClass的 實例。類型是一個接口或摘要 類,不能實例化。路徑....

做了一些谷歌上搜索,發現低於此設定:

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

如果我使用上述設置,即TypeNameHandling.All,錯誤消失。

問題在我的腦海:

  1. 是,這是解決這個問題(而且不知道該選擇什麼都不開盒即用)

  2. 任何性能或消極的影響正確的做法,我應該知道這個設置。

謝謝。

+0

當使用'TypeNameHandling'你需要用一個自定義序列化粘結劑檢查輸入的類型,出於安全原因。見例如[在Newtonsoft Json中的TypeNameHandling警告](http://stackoverflow.com/q/39565954/3744182)。有關替代策略,請參閱[使用json.net反序列化不使用類型信息的多態json類](http://stackoverflow.com/q/19307752/3744182)。 – dbc

+1

@dbc [此鏈接](http://stackoverflow.com/questions/29124126/polymorphic-json-deserialization-failing-using-json-net)更好,因爲它修復了第二個鏈接中的錯誤,如果json對象是遞歸。 –

回答

0

1.是,這是解決這個問題(而且不知道該選擇什麼都不開盒即用)
我認爲這是對DE /序列化繼承類NewtonSoft JSON正確的方法正確的做法。當我們使用設置TypeNameHandling = TypeNameHandling.All來設置/序列化時,序列化時將始終包含.NET類型名稱。沒有類型信息,轉換器很難決定哪個類將被de/serialized。

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

相關問題