該項目是一個Asp.Net Web API Web服務。自定義JsonConverter(Web API)中的Json.Net JsonSerializer中的自引用循環
我有一個類型層次,我需要能夠序列化和JSON,所以我採取的代碼從這個SO:How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?,並應用了轉換器到我的層次結構的基類;像這樣(有僞代碼這裏隱藏不相干):
[JsonConverter(typeof(TheConverter))]
public class BaseType{
///note the base of this type here is from the linked SO above
private class TheConverter : JsonCreationConverter<BaseType>{
protected override BaseType Create(Type objectType, JObject jObject){
Type actualType = GetTypeFromjObject(jObject); /*method elided*/
return (BaseType)Activator.CreateInstance(actualType);
}
}
}
public class RootType {
public BaseType BaseTypeMember { get; set; }
}
public class DerivedType : BaseType {
}
所以,如果我反序列化RootType
實例,其BaseTypeMember
是等於DerivedType
一個實例,然後將它反序列化回那個類型的實例。爲了記錄,這些JSON對象包含一個'$type'
字段,其中包含虛擬類型名稱(不是完整的.Net類型名稱),所以我可以同時支持JSON中的類型,同時準確控制哪些類型可以序列化和反序列化。
現在,這對於反序列化請求中的值非常有效;但是我有序列化問題。如果你看一下鏈接的SO,以及從頂部答案鏈接的Json.Net討論,你會發現我使用的基本代碼完全圍繞反序列化進行;以及其使用示例顯示手動創建串行器。由JsonCreationConverter<T>
帶來的JsonConverter
執行簡單地拋出一個NotImplementedException
。
現在,由於Web API使用單個格式化程序進行請求的方式,我需要在WriteObject
方法中實現「標準」序列化。
我必須在這一點上強調,在開始我的這部分項目之前,我有一切序列化正確沒有錯誤。
所以我這樣做:
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
但我得到一個JsonSerializationException
:Self referencing loop detected with type 'DerivedType'
,當一個對象序列化。再次 - 如果我刪除轉換器屬性(禁用我的自定義創建),那麼它工作正常...
我有一種感覺,這意味着我的序列化代碼實際上是在同一個對象上再次觸發轉換器,反過來再次調用序列化器 - 令人厭惡。 確認 - 看到我的回答
那麼什麼碼應該我可以在WriteObject
書面會做同樣的「標準」序列化的作品?
尼斯Q&A,但值得指出的是串行器是做正確的事情:它檢查尋找自定義序列化器的對象並找到一個。你應該擔心,如果它做了別的事情,否則它可能不尊重外國類的定製轉換器。 –
@RupertRawnsley是的我同意 –