將Message對象
序列化後,反序列化失敗。java
response
是序列化的結果,start
爲true
,end
爲false
。json
message
是反序列化後的對象,start
和end
都爲false。函數
通過本身的初步debug後,並無任何的頭緒,因此google了一下網上的解決辦法。學習
由於content
正確反序列化了,因此認爲是boolean
的問題,就去查關於反序列化布爾值的文章。測試
然而大面積都是相似下面這種標題的文章:this
好像跟個人問題有點不一樣,可是仍是抱着借鑑的心態看了幾篇。結果如預期,並無什麼用。可是從其中一片發現boolean
和Boolean
在反序列化時的處理有點不一樣。因此開始進行嘗試。google
這是一開始我實體中的字段設置,start
和end
都是基本類型。spa
而後將他們改爲封裝類型Boolean
,再來看一下結果:debug
start
和end
變成了null
,依然失敗。code
而後官方也提到了,boolean
默認爲false
,而Boolean
默認爲null
。也就是說,引發上面問題的緣由是在反序列化的時候,start
和end
兩個屬性沒有值。
又查了幾篇相關的文章後,依然沒有解決問題。因此想幹脆使用String
算了,進行字符傳遞。
然而,依然失敗。可是既然一樣是String
類型的,content
可以成功反序列化,爲何start
和end
就不行呢?
而後就開始了找不一樣。發現了問題的所在。
這裏我寫了一個本身的構造函數,可是參數只有content
,而沒有另外的參數。
找到了不一樣以後,問題就好解決了。在構造函數上填上另外兩個屬性就行了。
public Message(String content, String start, String end) { this.content = content; this.start = start; this.end = end; }
成功反序列化!而後在將字段換回Boolean
類型:
問題成功解決!
從上面咱們能夠猜想到,fastjson
在反序列化的時候,與構造函數是有關的,可是具體的關係,咱們還不清楚。因此繼續學習一下。
這裏咱們再添加一個構造函數,構造函數的參數只有兩個:
public Message(String content, Boolean start, Boolean end) { System.out.println("三個參數的構造函數"); this.content = content; this.start = start; this.end = end; } public Message(String content, Boolean start) { System.out.println("兩個參數的構造函數"); this.content = content; this.start = start; }
而後咱們調用的是三個參數的構造函數:
再用兩個和一個參數的構造函數測試:
public Message(String content, Boolean start) { System.out.println("兩個參數的構造函數"); this.content = content; this.start = start; } public Message(Boolean start) { System.out.println("一個參數的構造函數"); this.start = start; }
因此從這裏看,反序列化會選擇參數較多的構造函數。
而後再添加一個無參的構造函數:
public Message(String content, Boolean start, Boolean end) { System.out.println("三個參數的構造函數"); this.content = content; this.start = start; this.end = end; } public Message() { System.out.println("無參構造"); }
而後有無參數的構造函數的時候,會直接調用無參的構造函數。
綜上:
1.當沒有無參的構造函數時,調用參數較多的構造函數
2.當有無參構造函數時,調用無參構造函數
因此:咱們在涉及反序列化的時候,直接先寫一個無參構造函數。
有時候咱們最開始認爲的問題,並非真正的問題所在,可是這並不能影響咱們解決問題。按着步驟一步一步走,就會幫咱們排除問題,最終慢慢找到問題所在。