序列化与反序列化方案的对比和实现

本文探讨了在开发分布式定时任务框架时,GSON、FastJSON和Jackjson三种Java对象序列化工具的优缺点,包括性能、易用性、安全性及适用场景。Jackson因其广泛使用和灵活性是默认选择,但FastJSON适合追求速度,而GSON功能全面但性能略逊。
摘要由CSDN通过智能技术生成

最近写一个分布式定时任务框架,里面需要对Java对象进行序列化,在技术选型上,写下这篇文章来进行思考和比对。

1.GSON(功能最强大,性能稍逊)

GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。

基础用法如下

 private static Gson gson = null;
    static {
            gson= new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    }

    /**
     * Object 转成 json
     *
     * @param src
     * @return String
     */
    public static String toJson(Object src) {
        return gson.toJson(src);
    }

    /**
     * json 转成 特定的cls的Object
     *
     * @param json
     * @param classOfT
     * @return
     */
    public static <T> T fromJson(String json, Class<T> classOfT) {
        return gson.fromJson(json, classOfT);
    }

优势和缺陷:

  • 易于使用
  • 性能相对较好
  • 支持注解和泛型
  • 无法处理复杂的嵌套关系
  • 对于大型JSON文件,可能会占用较多内存(很容易导致GC问题)

2.FastJSON (慎用,除非要求极致的速度)

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

//可以使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象
     
    String jsonOutput= JSON.toJSONString(这里填java对象);

//我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。

//注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常:

    Person person = new Person(20, "John", "Doe", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);

fastjson的优点:

  1. 高性能:fastjson是一个高性能的JSON库,拥有较快的序列化和反序列化速度。
  2. 简单易用:fastjson提供了简单易用的API,使得使用者可以快速上手并进行JSON的处理。
  3. 支持自定义序列化和反序列化:fastjson支持自定义序列化和反序列化,使得开发者可以根据自身需求灵活地处理JSON数据。
  4. 支持多种数据类型:fastjson支持序列化和反序列化多种数据类型,包括基本数据类型、自定义对象、集合等。
  5. 支持跨语言:fastjson可以在多种编程语言中使用,包括Java、C++、Python等。

fastjson的缺点:

  1. 安全性问题:fastjson在处理JSON数据时存在一些安全性问题,容易受到JSON注入攻击。
  2. 缺少官方文档:fastjson的官方文档相对较少,开发者可能需要通过阅读源码或查找第三方资料来学习和使用。
  3. 社区支持相对较弱:相比于其他JSON库如Jackson和Gson,fastjson的社区支持相对较弱,开发者可能难以找到相应的解决方案。
  4. 较小的用户群体:由于fastjson的社区支持较弱,使用fastjson的用户群体相对较小,可能难以找到相关的经验和资源。

3.Jackjson (功能较强,性能较好,拓展性好)

Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。

默认情况下,Jackson通过将JSON字段的名称与Java对象中的getter和setter方法进行匹配,将JSON对象的字段映射到Java对象中的属性。 Jackson删除了getter和setter方法名称的“ get”和“ set”部分,并将其余名称的第一个字符转换为小写。

例如,名为brand的JSON字段与名为getBrand()和setBrand()的Java getter和setter方法匹配。 名为engineNumber的JSON字段将与名为getEngineNumber()和setEngineNumber()的getter和setter匹配。



ObjectMapper objectMapper = new ObjectMapper();

Person person = new Person(20, "John", "Doe", new Date());

String json = objectMapper.writeValueAsString(person);

Person person = objectMapper.readValue(json, Person.class);

jackjson的优点:

  • 解析大文件的速度比较快;
  • 运行时占用的内存比较少,性能更佳;
  • API 很灵活,容易进行扩展和定制。

jackjson的缺点:

  • Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
  • Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式 

 

  • 47
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值