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方法定義規範 然後要求子類必須定義具體實現 通過抽象類 我們就可以做到嚴格限制子類的設計 使子類之間更加通用...