fastjson反序列化方法JSON.parseObject(String str,ClassT clazz)

news/2024/5/19 1:04:28/文章来源:https://blog.csdn.net/woailuo23/article/details/103079782

fastjson这一工具包帮助我们进行java对象和json格式的字符串之间的相互转换。对象到字符串的过程,我们称之为序列化;反之,我们称为反序列化。

现在我们就来谈谈fastjson提供的反序列化方法,本篇只讨论按照指定的字节码返回相应对象的的反序列化方法,该方法有多种重载形式,按照重叠构造的模式设计。常用的入口为:JSON.parseObject(String text, Class<T> clazz),其调用链为:

JSON.parseObject(String text, Class<T> clazz) --> parseObject(String text, Class<T> clazz, Feature... features) --> parseObject(String input, Type clazz, ParserConfig config, int featureValues, Feature... features) --> parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor, int featureValues, Feature... features)

这样最终实际调用的方法及其参数值为:parseObject(input, clazz, ParserConfig.getGlobalInstance(), null, DEFAULT_PARSER_FEATURE, new Feature[0])。

我们关注下ParserConfig.getGlobalInstance(),每次调用返回同一个ParserConfig对象。这样其实保证了以JSON.parseObject(String text, Class<T> clazz)为入口的场景下,ParserConfig对象的全局唯一,即所谓的单例。

我们看看ParserConfig对象在fastjson反序列化过程中的作用:

作用一:维护了常用类型和反序列化器之间的对应关系,存放到IdentityHashMap<Type, ObjectDeserializer>中,并可通过getDeserializer(Type type)方法获得对象反序列化器ObjectDeserializer;对于非预定义好的类型,拿到该类型的反序列化器的同时,并建立该类型和相应反序列化器的对应关系,存放到IdentityHashMap<Type, ObjectDeserializer>中,以便后续直接使用;

作用二:创建字段反序列化器FieldDeserializer,而这些FieldDeserializer会维护到ObjectDeserializer的IdentityHashMap<String, FieldDeserializer>中,其中key为字段名称。

重点关注FieldDeserializer的生成,通过源码分析,通常情况下会调用ASMDeserializerFactory.getInstance().createFieldDeserializer(parserConfig, clazz, fieldInfo)生成字段反序列化器。

if (fieldClass == int.class || fieldClass == long.class || fieldClass == String.class) {
            return createStringFieldDeserializer(mapping, clazz, fieldInfo);
        }

通过上面createFieldDeserializer中的源码可以看出,针对int、long和String类型做了特殊处理,进一步分析发现其内部利用asm字节码增加技术对IntegerFieldDeserializer、LongFieldDeserializer以及StringFieldDeserializer做了扩展,动态生成了新的类。

类名为:String name = "Fastjson_ASM__Field_" + clazz.getSimpleName();
        name += "_" + fieldInfo.getName() + "_" + seed.incrementAndGet();(注意seed此种场景下是单例的)

该类主要是新增了setValue()方法,应该是用来对字段进行赋值操作的(PS:关于对象序列化和字段序列化器的内部处理逻辑有机会可进一步分析研究)

综上:针对保留了永久代的jvm,对于如上三种类型的字段,在创建FieldDeserializer时会动态生成新的类,造成jvm加载的类的数目上升,永久代内存的增加。当然通常情况,一个项目中需要反序列化的类是有限的,并且因为常用情况下ParseConfig是单例,相应字段对应的字段序列化器类生成一份后就不在重复生成了,永久代内存通常情况下也就不会溢出。

JSON.parseObject ( reqMsg, ReqMsgDto.class, new ParserConfig() , JSONObject.DEFAULT_PARSER_FEATURE )

但若如上进行api的调用,此种情况下ParserConfig不在全局唯一,就可能会持续不断的生成字段序列化器类,从而造成java.lang.OutOfMemoryError: PermGen space。此种场景下应将ParserConfig的实例作为类变量或者成员变量,以避免每次调用都会创建新的字段序列化类。

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_874656.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频网站套上CDN是什么效果?

1、什么是CDN加速&#xff1f; 内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是在现有 Internet 中增加的一层新的网络架构&#xff0c;由遍布全国的高性能加速节点构成。这些高性能的服务节点都会按照一定的缓存策略存储您的业务内容&#xff0c…

CMU-CSAPP-深入理解计算机系统-P1-courseoverview

首先让我们看一个实例 原因是数据是如何在内存中布局。C不会进行边界检查&#xff0c;容易崩溃 这两种程序功能是一样的 但是他们的时间完全不一样

1001、单机安装基于LNMP结构的WordPress网站、web与数据库服务分离

project 第1部分 文章目录 project 第1部分project1 整体架构一、单机安装基于LNMP&#xff08;Linux Nginx Mysql PHP&#xff09;结构的WordPress网站1、 基本环境准备2、配置nginx3、配置数据库服务器4、部署wordpress 二、web与数据库服务分离准备数据库服务器自由扩展&…

阿里云——手把手教你搭建个人网站

言归正传&#xff0c;阿里算是做云服务最早的一批了&#xff0c;当时的其他几家有名气的现在基本都死了&#xff0c;只有阿里这支部队熬过来了&#xff0c;就我了解的几家云商做个简单的介绍&#xff1a; 青云&#xff1a;有情怀有理想&#xff0c;不过短板也很明显&#xff0c…

Servlet+JSP+MySQL社交网站

在网站架构上&#xff0c;采用MVC设计模式&#xff0c;实现将网站的页面显示与业务逻辑分离&#xff0c;使其各司其职&#xff1b;在数据库操作上&#xff0c;利用DAO模式&#xff08;Data Access Object数据存取对象&#xff09;技术&#xff0c;将程序中的类对象映射成为数据…

《大型网站系统与JAVA中间件实践》pdf版电子书网盘附下载链接+仪式感技术书阅读法

附Java/C/C/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全&#xff1a; 书单导航页&#xff08;点击右侧 极客侠栈 即可打开个人博客&#xff09;&#xff1a;极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50本&#xff08;珍藏版) ②【算法…

《大型网站技术架构:核心原理与案例分析李智慧》pdf版电子书网盘附下载链接+仪式感技术书阅读法

附Java/C/C/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全&#xff1a; 书单导航页&#xff08;点击右侧 极客侠栈 即可打开个人博客&#xff09;&#xff1a;极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50本&#xff08;珍藏版) ②【算法…

SSM(springMVC+spring+mybatis)旅游网站项目源码,课程设计(毕业设计)

最近在翻文件的时候发现大四时的毕业设计&#xff0c;一个旅游网站&#xff0c;虽然代码写得很烂&#xff0c;但还是可以跑起来&#xff0c;想着删了还不如分享一下&#xff0c;毕竟我也觉得做毕设是真的无聊又浪费时间......... 整体功能图(其实是做得很敷衍&#xff0c;大部…

如何使用TFilter网站快速获取FIR滤波器的相关系数

最近需要对数据进行滤波&#xff0c;考虑到赛灵思已经有免费的FIR滤波器的ip核&#xff0c;便准备使用硬件进行滤波。但是不论是怎样使用FIR滤波器&#xff0c;都离不开相关系数的确定。实际设计中&#xff0c;不可能拿笔去一个个数值的计算&#xff0c;因此需要借助工具。 网上…

Linux基础PHP网站搭建

我们以ubuntu20.04为例&#xff0c;接下为了方便操作我们用Xshell连接Ubuntu20.04 输入&#xff1a;apt-get install apache2 &#xff08;安装apache&#xff0c;遇到选择全部选择Y&#xff09; 输入&#xff1a;service apache2 restart &#xff08;重新启动apache2…

自己做了个网站 网址:http://www.sunshinelin.club

网址&#xff1a; http://www.sunshinelin.club 当初做这个网站的目的就是为了能够自己用&#xff0c;想做什么功能就写什么功能。感觉使用自己的东西比较有成就感。 这个是网站的首页 我用的ssmshiro后台框架开发&#xff0c;服务是阿里云的centOS 在开发的时候会遇到各…

PHP网站上传大文件失败

问题&#xff1a; 上传较大的视频文件失败 解决&#xff1a; 1.修改网站本身的上传大小限制 2.修改php.ini文件&#xff0c;修改这两个参数post_max_size,upload_max_filesize&#xff0c;根据自己的需要设置大小&#xff0c;单位为M 3.IIS的设置&#xff0c;在发布网站 …

旧手机建立自己的博客网站之踩坑记||在旧手机上建立自己的服务器(2)||2020年新货

接上一篇 接下来配置LNPM环境。 方案一 根据大佬的博文安装时会出现以下情况网站搜索无果&#xff0c;全是让改软件源的&#xff0c;改完后问题依然&#xff0c;其实分析后可知&#xff0c;无法定位就是源里面没有软件或者源错误&#xff0c;所以 这里不指定版本安装。 这里…

将网站、网页变成灰白色调的哀悼风格界面的CSS代码

下面来分享下使网站变成灰白色调&#xff0c;哀悼风格界面的代码&#xff1a; html { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter:progid:DXImageTransform…

Web实现:仿电子仪器网站 含HTML CSS部分 内含效果图

效果图&#xff1a; index.html <!DOCTYPE html> <html> <head><title>公司首页</title><link rel"stylesheet" type"text/css" href"css/index.css"> </head> <body><div id"all&quo…

Web实现:徐州旅游网站 含html和css 内含效果图

实现内容&#xff1a; 在首页中插入了背景音乐&#xff0c;在各页面中介绍了徐州当地景点和附近酒店&#xff0c;可以报名参加旅游团&#xff0c;也可以对服务进行投诉反馈。 效果图1&#xff1a; 效果图2&#xff1a; 效果图3&#xff1a; index.html <!DOCTYPE html&g…

Web实现:完整版垃圾分类网站 html+css 内含效果图

实现&#xff1a;完整版垃圾分类网站 效果图1&#xff1a; 效果图2&#xff1a; 效果图3&#xff1a; index.html: <!DOCTYPE html> <html> <head><title>首页</title><link rel"stylesheet" type"text/css" href&qu…

使用bootstrap中的栅格系统轻松实现网站响应式布局

网站分为主体和底部两大部分&#xff0c;使用bootstrap中的栅格系统实现网站响应式布局&#xff1a; .html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" c…

Python爬虫英语四六级网站查询准考证号

本文仅限于学习交流&#xff01;&#xff01;&#xff01; 一、思路 在四六级查询网站&#xff1a;http://cet-kw.neea.edu.cn/Home/QueryTestTicket 1、先找查询接口&#xff0c;因此咱们先正儿八经的查询一次。 2、F12通过检查&#xff0c;发现了查询接口、验证码图片、查…

如何给网站添加ico图标

<link rel"shortcut icon" href"${base}/static/favicon.ico" type"image/x-icon" />