坑:java中的序列化和反序列化遇到的问题

最近,同事在开发中遇到的坑,拿出来记录一下,防止后面入坑。

目前,java序列化与反序列化json常用的类库有:fastJSON、Jackson和Gson,这个问题出现在fastjson中。
一个常用的栗子:

public static void main(String[] args) {
    List before = new ArrayList<>();
    before.add(1L);

    String json = JSONArray.toJSONString(before);

    List after = JSONArray.parseArray(json, Object.class);
    System.out.println("after = " + after);
}
 
  

输出结果为:

after = [1]

这应该是没问题的,然而接下来的操作就会很尴尬:

public static void main(String[] args) {
    List before = new ArrayList<>();
    before.add(1L);

    String json = JSONArray.toJSONString(before);

    List after = (List)(Object)JSONArray.parseArray(json, Object.class);
    Long longValue = after.get(0);
    System.out.println("longValue = " + longValue);
    System.out.println("after = " + after);
}

这个时候,报错了…

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

为什么呢?
after是一个List,我从一个List中get一个Long对象,有问题吗?
还真有问题…

看下debug的结果:
坑:java中的序列化和反序列化遇到的问题_第1张图片
吓死啦…这竟然是Integer,怪不得会报错。

带着好奇心理,同事又做了些尝试…

数字1在反序列化后是Integer,那如果超过了Integer的最大值怎么办呢?总不能还是Integer吧?
来试试看:

public static void main(String[] args) {
    List before = new ArrayList<>();
    before.add(1L);
    before.add(Long.valueOf(Integer.MAX_VALUE) + 1);
    String json = JSONArray.toJSONString(before);

    List after = (List)(Object)JSONArray.parseArray(json, Object.class);
    Long longValue = after.get(1);
    System.out.println("longValue = " + longValue);
    System.out.println("after = " + after);
}

代码搞出来了,看看结果:

longValue = 2147483648
after = [1, 2147483648]

咦,没报错,debug看一下:
坑:java中的序列化和反序列化遇到的问题_第2张图片
超过了Integer的最大值,fastjson给反序列化成了Long类型,这就清晰了。

然而,在List中同时存在Integer和Long确实让人不解。

姑且认为fastJSON这样做是一种序列化策略吧…

你可能感兴趣的:(Java)