fastjson 反序列化的問題

問題描述

Message對象序列化後,反序列化失敗。java

clipboard.png

response是序列化的結果,starttrueendfalsejson

message是反序列化後的對象,startend都爲false。函數

問題解決

1.資料查找

通過本身的初步debug後,並無任何的頭緒,因此google了一下網上的解決辦法。學習

由於content正確反序列化了,因此認爲是boolean的問題,就去查關於反序列化布爾值的文章。測試

然而大面積都是相似下面這種標題的文章:this

clipboard.png

好像跟個人問題有點不一樣,可是仍是抱着借鑑的心態看了幾篇。結果如預期,並無什麼用。可是從其中一片發現booleanBoolean在反序列化時的處理有點不一樣。因此開始進行嘗試。google

2.初步嘗試

clipboard.png

這是一開始我實體中的字段設置,startend都是基本類型。spa

而後將他們改爲封裝類型Boolean,再來看一下結果:debug

clipboard.png

startend變成了null,依然失敗。code

而後官方也提到了,boolean默認爲false,而Boolean默認爲null。也就是說,引發上面問題的緣由是在反序列化的時候,startend兩個屬性沒有值。

3.再次嘗試

又查了幾篇相關的文章後,依然沒有解決問題。因此想幹脆使用String算了,進行字符傳遞。

clipboard.png

clipboard.png

然而,依然失敗。可是既然一樣是String類型的,content可以成功反序列化,爲何startend就不行呢?

而後就開始了找不一樣。發現了問題的所在。

clipboard.png

這裏我寫了一個本身的構造函數,可是參數只有content,而沒有另外的參數。

4.問題解決

找到了不一樣以後,問題就好解決了。在構造函數上填上另外兩個屬性就行了。

public Message(String content, String start, String end) {
    this.content = content;
    this.start = start;
    this.end = end;
}

clipboard.png

成功反序列化!而後在將字段換回Boolean類型:

clipboard.png

問題成功解決!

fastjson反序列化

從上面咱們能夠猜想到,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;
}

而後咱們調用的是三個參數的構造函數:

clipboard.png

再用兩個和一個參數的構造函數測試:

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;
}

clipboard.png

因此從這裏看,反序列化會選擇參數較多的構造函數。

而後再添加一個無參的構造函數:

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("無參構造");
}

clipboard.png

而後有無參數的構造函數的時候,會直接調用無參的構造函數。

綜上:

1.當沒有無參的構造函數時,調用參數較多的構造函數
2.當有無參構造函數時,調用無參構造函數

因此:咱們在涉及反序列化的時候,直接先寫一個無參構造函數。

總結

有時候咱們最開始認爲的問題,並非真正的問題所在,可是這並不能影響咱們解決問題。按着步驟一步一步走,就會幫咱們排除問題,最終慢慢找到問題所在。

相關文章
相關標籤/搜索