簡體   English   中英

java.lang.Number擴展的Jackson序列化和反序列化

[英]Jackson Serialization and Deserialization of java.lang.Number Extensions

我正在嘗試使用Jackson來序列化和反序列化擴展java.lang.Number的自定義數字類。 下面是該類的准系統實現,而沒有擴展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

Jackson未能反序列化,聲稱“找不到從Number值反序列化的合適的創建者方法(14169630718280903901)”。 此外,它有時僅會失敗。

有誰知道為什么會這樣或如何使Jackson成功反序列化為擴展java.lang.Number的類的實例?

davidxxx確實是對的,只有當序列號大於Long.MAX_VALUE時,反序列化才會失敗。 問題比這更深。

UnsignedNumericClass不擴展Number ,Jackson會將其視為普通對象,並通過getter,setter和默認構造函數UnsignedNumericClass()序列化/反序列化。

一旦UnsignedNumericClass擴展Number ,Jackson便會通過toString()和String參數構造函數UnsignedNumericClass(String data)進行序列化/反序列化。 請注意,如果不存在字符串參數構造函數,則將引發異常。

我遇到了一個問題,因為我正在實現一個無符號的64位數字。 因為數字是無符號的,所以我的toString()實現打印了private long data字段的無符號解釋。

反序列化數字類型時,Jackson會執行檢查以確保它是有效數字。 也就是說,它檢查JSON文檔中給定的數字是否小於Long.MAX_VALUE 如果不是這種情況,則它依賴於自定義反序列化器,而不僅僅是使用我的String-argument構造函數,該構造函數可以很好地處理數字。 由於未指定自定義反序列化器,因此它將引發“沒有合適的創建者方法”異常。 因此,解決方案是定義一個簡單的自定義反序列化器,該反序列化器使用String-argument構造函數:

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()注釋指定Jackson使用此反序列化器:

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

我認為在Jackson中預定義了BigInteger的自定義解串器,因此該類不會出現此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM