fastJSON、Gson、Jackson序列化与反序列化在一个场景中的对比

前面文章https://blog.csdn.net/liuzy10_yang/article/details/100566624中有看到,fastJSON在序列化和反序列化时的问题:

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

原因我们也看到了,是在反序列化的时候,将数字1反序列化成了Integer类型:
fastJSON、Gson、Jackson序列化与反序列化在一个场景中的对比_第1张图片
那么,在Gson和Jackson中是如何处理的呢?

代码走起看下:

Gson:

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

    Gson gson = new Gson();
    String json = gson.toJson(before);
    List after = gson.fromJson(json, new TypeToken>(){}.getType());
    Long longValue = after.get(0);
    System.out.println("longValue = " + longValue);
}

结果呢?同样…

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

debug结果:
fastJSON、Gson、Jackson序列化与反序列化在一个场景中的对比_第2张图片
是Double…真是难受

Jackson:

Jackson走起看下
先列出代码

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

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(before);
        List after = mapper.readValue(json, List.class);
        Long longValue = after.get(0);
        System.out.println("longValue = " + longValue);

    }

结果:

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

可怜,依然是报错
debug一下:
fastJSON、Gson、Jackson序列化与反序列化在一个场景中的对比_第3张图片
依旧如此,既然都是这样错误,那就记住别这样用就好了…

根本原因其实也不赖这三大类库,想一个生活中都问题:
小明去理发,理发原因是想漂漂亮亮的去相亲,结果,理完发后说不好看,想回到理发前的发型,你说可能吗?显然不可能,只能是任理发师给你做成什么发型,尽可能的恢复你的原貌。

你可能感兴趣的:(Java)