当前位置:网站首页>搞懂fastjson 对泛型的反序列化原理
搞懂fastjson 对泛型的反序列化原理
2022-07-07 00:34:00 【香菜聊游戏】
fastjson 是现在非常常用的一个json 的序列化和反序列化工具,是阿里发布的,虽然最近一直在暴雷,各种漏洞,但是这不影响我们学习他。
fastjson的使用
加入依赖
在pom.xml中直接增加fastjson的依赖就行了,向下面这样
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
常规使用
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(10);
//转为字符串
String jsonStr = JSON.toJSONString(treeNode);
// 字符串转为对象
TreeNode treeNode1 = JSON.parseObject(jsonStr, TreeNode.class);
System.out.println();
}
泛型的使用
看下我们常用的反序列化
List<TreeNode> list = JSON.parseObject("",new TypeReference<List<TreeNode>>(){});
先解释下: TypeReference 是一个泛型类,持有了当前的类型
这里的泛型的反序列化,到底是如何实现的呐? 到底在运行时怎么知道需要序列化的泛型是什么呐? 今天学习下知识点,也是今天主要想记录的。
源码
想懂原理还得扒源码,看懂了也没什么神奇了
知识点1 匿名类
new TypeReference<List>(){}
这行代码就是创建一个匿名类,等价于创建一个类实现TypeReference ,然后进行实例化。 千万不要迷糊,因为平常的时候我们一般是对接口使用,比如 Runnable,不熟悉的话可以复习下
知识点2 重点
直接点进去TypeReference 这个类,可以看到下面的构造函数
protected TypeReference(){
Type superClass = getClass().getGenericSuperclass();
// 这里是重点,看样子可以获取到泛型的信息
Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
Type cachedType = classTypeCache.get(type);
if (cachedType == null) {
classTypeCache.putIfAbsent(type, type);
cachedType = classTypeCache.get(type);
}
this.type = cachedType;
}
Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
这个函数开发中是极少使用,即使作为老司机我也没有用过这个函数,你用过吗?
这句一定要记住,也是泛型的实现最重要的方式,一定是superclass,还做了一次强转。然后转为自己要用的类型 注意这里
总结
最后总结下,fastjson的泛型的反序列化底层原理就是根据type 进行反序列化, 知识点就是 匿名类 和 getActualTypeArguments 最后留个作业,你可以模拟一个这样的场景,如果你在开发中需要在运行时知道泛型的类型, 可以使用这种方法
边栏推荐
- Common skills and understanding of SQL optimization
- Harmonyos practice - Introduction to development, analysis of atomized services
- async / await
- Taobao store release API interface (New), Taobao oauth2.0 store commodity API interface, Taobao commodity release API interface, Taobao commodity launch API interface, a complete set of launch store i
- 数据中心为什么需要一套基础设施可视化管理系统
- 《ClickHouse原理解析与应用实践》读书笔记(6)
- bat 批示处理详解
- 原生小程序 之 input切换 text与password类型
- AI face editor makes Lena smile
- mac版php装xdebug环境(m1版)
猜你喜欢
Distributed global ID generation scheme
The 2022 China low / no code Market Research and model selection evaluation report was released
Introduction to distributed transactions
力扣102题:二叉树的层序遍历
分布式事务解决方案之2PC
Digital IC interview summary (interview experience sharing of large manufacturers)
[paper reading] semi supervised left atrium segmentation with mutual consistency training
PTA 天梯赛练习题集 L2-004 搜索树判断
[daily training -- Tencent selected 50] 235 Nearest common ancestor of binary search tree
Bat instruction processing details
随机推荐
Educational Codeforces Round 22 B. The Golden Age
linear regression
产业金融3.0:“疏通血管”的金融科技
目标检测中的损失函数与正负样本分配:RetinaNet与Focal loss
Three level menu data implementation, nested three-level menu data
Data storage 3
目标检测中的BBox 回归损失函数-L2,smooth L1,IoU,GIoU,DIoU,CIoU,Focal-EIoU,Alpha-IoU,SIoU
STM32 key state machine 2 - state simplification and long press function addition
《ClickHouse原理解析与应用实践》读书笔记(6)
Flink SQL realizes reading and writing redis and dynamically generates hset key
AI人脸编辑让Lena微笑
Paper reading [semantic tag enlarged xlnv model for video captioning]
[云原生]微服务架构是什么?
Forkjoin is the most comprehensive and detailed explanation (from principle design to use diagram)
Mybaits multi table query (joint query, nested query)
Dynamic memory management
How much do you know about clothing ERP?
微信小程序蓝牙连接硬件设备并进行通讯,小程序蓝牙因距离异常断开自动重连,js实现crc校验位
Explication contextuelle du langage Go
Flinksql 读写pgsql