繁体   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