我有一個由TransformationPlanModel
組成的數據模型,它又包含一個IEnumerable<TransformationModel>
。 TransformationPlanModel
是根數據傳輸對象。 TransformationModel
是其他轉換模型的抽象基類。自檢迴路檢測到沒有的地方
TransformationPlanModel
剪斷代碼:
public class TransformationPlanModel
{
// snip
public IEnumerable<TransformationModel> Transformations { get; set; }
}
剪斷代碼TransformationModel
:
public abstract class TransformationModel
{
//snip
public string Key { get; set; }
}
一個具體的改造模式是RemoveRowsTransformationModel
:
public class RemoveRowsTransformationModel : TransformationModel
{
public const string KeyConst = "removeRows";
public int TopRowsCount { get; set; }
public int BottomRowsCount { get; set; }
public RemoveRowsTransformationModel()
{
Key = KeyConst;
}
//snip
}
我寫了一個自定義的JsonConverter
它轉換th e繼承樹。 JsonWrite
方法的實現是:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JObject.FromObject(value, serializer).WriteTo(writer);
}
自定義轉換器在ASP.NET核心API應用程序中使用和添加到服務於Startup.ConfigureServices
方法,像這樣:
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new TransformationConverter());
});
當TransformationPlanModel
作爲API端點的響應返回並被序列化,則會引發一個Newtonsoft.Json.JsonSerializationException
,其中包含消息:「檢測到類型爲'(...).ReadRowsTransformationModel'」的自回參考循環。什麼導致這種異常?我無法看到自引用循環的位置。我不知道它的問題,但我使用.NET核2.0預覽1.
有趣的是,當JObject.FromObject
沒有串行參數的重載在WriteJson
方法時,它工作正常:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JObject.FromObject(value).WriteTo(writer);
}
但是,這會重置序列化設置,如駝峯屬性命名。我也嘗試忽略Json.Net設置中的循環引用,但是沒有任何轉換被序列化。