2016-11-29 137 views
0

我想用Jackson來序列化和反序列化一個自定義的數字類,它擴展了java.lang.Number。下面是該課程的準系統實施,沒有擴展NumberJackson的序列化和java.lang.Number擴展的反序列化

import com.google.common.primitives; 
public class UnsignedNumericClass { 
    private long data; 
    public UnsignedNumericClass(long data) { 
     this.data = data; 
    } 
    public UnsignedNumericClass(String data) { 
     this.data = UnsignedLongs.decode(data); 
    } 
    public UnsignedNumericClass() {} 
    public void setData(long data) {this.data = data;} 
    public long getData() {return data;} 
    public toString() {return UnsignedLongs.toString(data);} 

    public int intValue() {return (int) data;} 
    public long longValue() {return data;} 
    public float floatValue() {return data;} 
    public double doubleValue() {return data;} 
} 

這與傑克遜扮演得很好,但是第二我改變類閱讀

public class UnsignedNumericClass extends Number 

傑克遜未能反序列化,聲稱「發現從數字值(14169630718280903901)反序列化沒有合適的創造者法」 。此外,它只是有時失敗。

有誰知道爲什麼會發生這種情況,或者如何讓傑克遜成功地反序列化到延伸java.lang.Number的類的實例?

回答

0

davidxxx確實是正確的,當數序列大於Long.MAX_VALUE是反序列化只是失敗。這個問題比這個要深一點。

UnsignedNumericClass未延伸Number時,傑克遜將其視爲普通對象,並通過getter,setters和默認構造函數UnsignedNumericClass()進行序列化/反序列化。

一旦UnsignedNumericClass延伸Number,傑克遜更改爲序列化/反序列化通過toString()和字符串參數構造函數UnsignedNumericClass(String data)。請注意,如果String參數構造函數不存在,則會引發異常。

我遇到了問題,因爲我正在實現一個無符號的64位數字。由於該數字未經簽名,因此我的toString()實現將打印private long data字段的未簽名解釋。

當對數字類型進行反序列化時,Jackson執行檢查以確保它是有效的數字。也就是說,它檢查JSON文檔中給出的數字是否小於Long.MAX_VALUE。如果不是這種情況,它依賴於一個自定義的反序列化器,而不是僅僅使用我可以處理數字的String參數構造器。由於沒有指定自定義的反序列化器,它會拋出「不合適的創建者方法」異常。因此,解決方法是定義使用字符串參數的構造一個簡單的自定義解串器:

public class CustomDeserializer extends StdDeserializer<UnsignedNumericClass> { 
    public CustomDeserializer(){super(null);} 
    public CustomDeserializer(Class<?> c){super(c);} 
    public UnsignedNumericClass deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException{ 
     return new UnsignedNumericClass(jsonParser.getText()); 
} 

然後我們指定傑克遜通過@JsonDeserialize()註釋使用此解串器:

@JsonDeserialize(using=CustomDeserializer.class) 
public class UnsignedNumericClass extends Number 

我想自定義在Jackson中預定義了BigInteger的解串器,所以該問題不會出現在該類中。