• 搞懂fastjson 对泛型的反序列化原理


    fastjson 是现在非常常用的一个json 的序列化和反序列化工具,是阿里发布的,虽然最近一直在暴雷,各种漏洞,但是这不影响我们学习他。

    fastjson的使用

    加入依赖

    在pom.xml中直接增加fastjson的依赖就行了,向下面这样

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>fastjson</artifactId>
    4. <version>1.2.75</version>
    5. </dependency>

    常规使用

    1. public static void main(String[] args) {
    2. TreeNode treeNode = new TreeNode(10);
    3. //转为字符串
    4. String jsonStr = JSON.toJSONString(treeNode);
    5. // 字符串转为对象
    6. TreeNode treeNode1 = JSON.parseObject(jsonStr, TreeNode.class);
    7. System.out.println();
    8. }

    泛型的使用

    看下我们常用的反序列化

    List<TreeNode>  list = JSON.parseObject("",new TypeReference<List<TreeNode>>(){});
    

    先解释下: TypeReference 是一个泛型类,持有了当前的类型

    这里的泛型的反序列化,到底是如何实现的呐? 到底在运行时怎么知道需要序列化的泛型是什么呐? 今天学习下知识点,也是今天主要想记录的。

    源码

    想懂原理还得扒源码,看懂了也没什么神奇了

    知识点1 匿名类

    new TypeReference<List>(){}

    这行代码就是创建一个匿名类,等价于创建一个类实现TypeReference ,然后进行实例化。 千万不要迷糊,因为平常的时候我们一般是对接口使用,比如 Runnable,不熟悉的话可以复习下

    知识点2 重点

    直接点进去TypeReference 这个类,可以看到下面的构造函数

    1. protected TypeReference(){
    2. Type superClass = getClass().getGenericSuperclass();
    3. // 这里是重点,看样子可以获取到泛型的信息
    4. Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    5. Type cachedType = classTypeCache.get(type);
    6. if (cachedType == null) {
    7. classTypeCache.putIfAbsent(type, type);
    8. cachedType = classTypeCache.get(type);
    9. }
    10. this.type = cachedType;
    11. }

    Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

    这个函数开发中是极少使用,即使作为老司机我也没有用过这个函数,你用过吗?

    这句一定要记住,也是泛型的实现最重要的方式,一定是superclass,还做了一次强转。然后转为自己要用的类型 注意这里

    总结

    最后总结下,fastjson的泛型的反序列化底层原理就是根据type 进行反序列化, 知识点就是 匿名类 和 getActualTypeArguments 最后留个作业,你可以模拟一个这样的场景,如果你在开发中需要在运行时知道泛型的类型, 可以使用这种方法

     

  • 相关阅读:
    业务-(课程-章节-小节)+课程发布一些业务思路
    k8s集群添加新节点-主节点和工作节点
    七夕情人节表白网页代码大全(浪漫的html表白源代码)
    CSAPP Lab4: Cache
    mysql 集群恢复
    8、IOC 之容器扩展点
    金融壹账通香港上市:市值63亿港元 叶望春称守正笃实,久久为功
    基于后端和爬虫创建的代理ip池
    零基础学python之元组
    什么是数字化营销?企业数字化有多重要?
  • 原文地址:https://blog.csdn.net/perfect2011/article/details/125594213