[英]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.