FastJson下抽象類的反序列化解決思路

2021-10-19 23:35:40 字數 1751 閱讀 1123

aresult a結果

bresult b結果

abstractresult 結果基類

在存入mongo時結果將會以list序列化存入mongo,但是在取出結果時出現了問題。

通過mongo取出資料後,希望還原成為list,於是通過反序列化來還原格式,此時出現問題,因為abstractresult是抽象類,在進行反序列化時,無法反序列化成為對應的類。於是反序列化出來的list內元素全是null

通過網上查詢有關fastjson抽象類反序列化的解決辦法,只找到了一篇相關:

本文的解決思路是編寫parserconfig類,類中複寫getdeserializer(type type)方法,並在json.parseobject時作為引數傳入,該方法是用來根據類名來返回具體的反序列化方法的,通過複寫該方法,在遇到type為abstractresult.class時,就可以返回指定的子類的反序列化方法,如

parserconfig parserconfig = new parserconfig() 

return super.getdeserializer(type);

}};

bresult方法或者aresult方法。嘗試該解決思路,發現在整個list都是同一種子類時可以實現正常的反序列化,將整個list反序列化為aresult或者bresult。

上面的解決方法雖然能夠成功,但是並不能解決實際遇到的問題,因為實際需要進行反序列化的list中的型別不是統一的,而是aresult和bresult同時存在的,所以必須有更加精確的反序列化方法。

網上沒有類似問題的解決思路,於是只能翻閱原始碼查詢解決思路。在檢視了大量原始碼之後,找到了解決方案。

本解決方案借鑑了思路一的方法,在遇到type為abstractresult.class時,返回我自己編寫的自定義的反序列化方法。**如下

private static final parserconfig parserconfig = new parserconfig() 

return super.getdeserializer(type);

}};

其中abstractresultdeserializer的原始碼如下

public class abstractresultdeserializer implements objectdeserializer else 

}@override

public int getfastmatchtoken()

public static integer findendpoint(string text , int begin)

if (ch == '}')else }}

return t;

}}

自定義反序列化的具體反序列過程就是通過重寫deserialze()方法實現,下面介紹一下方法內的變數和函式

characteristic aresult類中特有的變數名稱

text  反序列化的總文字

begin list反序列化進行到的位置

findendpoint()該函式能找到當前反序列化類在文字中的結束位置

該自定義反序列化主要邏輯為

1.從整體list需要反序列化的文字中分割出當前類的文字

2.判斷文字中是否存在aresult類中特有的變數名稱

3.若存在則呼叫aresult的反序列方法

4.若不存在則呼叫bresult的反序列方法

抽象類 抽象方法

抽象類 1.類名前有abstruct修飾。有構造方法。在建立抽象類的子類的時候,還是會先建立抽象父類的物件的。2.抽象類不能例項化是指不能手動的new。抽象方法 1.抽象方法 沒有方法體且需要用abstruct關鍵字修飾 作用 需要改變的地方都應該是抽象。抽象方法只能存在於抽象類或介面中。2.有抽象...

抽象類,抽象方法

1 抽象類中可以有實現的方法。抽象方法必須在抽象類中。using system using system.collections.generic using system.linq using system.text namespace test 抽象類可以包含抽象屬性 public int age...

抽象類 抽象方法

抽象方法 使用 abstract修飾的方法,只有方法的宣告 沒有方法體 定義的是一種 規範 就是告訴子類必須要給抽象方法提供具體的實現 抽象類 包含抽象方法的類就是抽象類 通過abstract方法定義規範 然後要求子類必須定義具體實現 通過抽象類 我們就可以做到嚴格限制子類的設計 使子類之間更加通用...