JSON字符串反序列化 动态泛型

news/2024/12/31 4:16:02/文章来源:https://www.cnblogs.com/cjsblog/p/18460884

需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。

方案一:将方法参数存成JSON字符串,然后JSON反序列化成对象,然后反射调用

目标方法时这样的:

CommandResp sendXXX(BaseCommandApiDTO<XXX> baseCommandApiDTO);

方式一:FastJson

Class mainBody = Class.forName(entity.getMainBodyType());
ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(new Type[]{mainBody}, null, BaseCommandApiDTO.class);
Object obj = JSON.parseObject(entity.getMsgText(), parameterizedType);CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);

方式二:Jackson

public class ObjectMapperHolder {private static final ObjectMapper objectMapper = new ObjectMapper();public static ObjectMapper getObjectMapper() {objectMapper.registerModule(new Jdk8Module());objectMapper.registerModule(new JavaTimeModule());return objectMapper;}
}ObjectMapper mapper = ObjectMapperHolder.getObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(BaseCommandApiDTO.class, mainBody);
Object obj = mapper.readValue(entity.getMsgText(), javaType);CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);

实践中发现,这两种方式容易导致OOM

方案二:直接将参数对象存到数据库中

数据库对应字段设置BLOB类型(这里设置的是MEDIUMBLOB) ,对应的java字段类型是byte[]

//  写入对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(baseCommandApiDTO);
oos.flush();
byte[] data = bos.toByteArray();//  读取对象
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(entity.getMsgObj()));
Object obj = ois.readObject();

最后的最后,优化建议:

1、尽量不要在数据库中存json字符串,如果非要存,建议字段类型设置为json,这样可以节省空间。因为你无法控制json字符串的长度,所以长度设置是个问题,另外json反序列化比较占内存。

2、长度很大的字段(比如blob类型的)建议单独存一张关联表

 

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

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

相关文章

软工个人总结

结束了? 一、学期回顾 1.1 课程想象与现实 最初听闻软件工程课程,脑海中浮现的是一群程序员在电脑前敲打着代码,创造出一个个功能强大的软件。想象着自己能通过这门课,精通多种编程语言,独立开发出令人惊艳的应用程序。可是在第一次编程作业布置下来时,发现自己什么也不会…

UML之关联

关联指两个类之间的各种联系。UML使用各种单实线表示关联,但关联所能够表达的信息远不只是一条实线所传递的依赖。关联指两个类之间的各种联系。UML使用各种单实线表示关联,这个单实线可以是直线(垂直的、水平的或者倾斜的)、折线甚至曲线。 事实上,关联也是展示类的属性的…

代码随想录——动态规划13.分割等和子集

思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。背包的体积为sum / 2 背…

深度解析 Transformer 模型中的位置嵌入(Positional Embedding)

在自然语言处理中,词语的顺序对句子的意义至关重要。然而,传统的自注意力机制无法区分词语的位置。本文深入浅出地介绍了**位置嵌入(Positional Embedding)**的概念及其在Transformer模型中的作用,解释了它如何帮助模型理解词语的顺序,从而提升文本处理的准确性。通过简单…

java8--方法--格式化输出--printf--索引

System.out.printf("%1$s %2$tB %2$te %2$tY","Due date",new Date()); 效果图:ps: 1.一个字符串需要有多个格式化单词,通过建立索引实现,索引值用%$包围,$后紧跟格式化的目标类型,后面按顺序传入变量或填写内容 2.t指定日期类型,b指定填充月份的完…

前端重学之Number

Number (尾附IEEE754解读) mdn文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Numberjs里的number是双进度浮点数 用IEEE745 编码 0b 0o 0x 分别表示 二进制 八进制 十六进制```js 0.tostring() //报错 0 .tostring()//正确 ```IEEE7…

DVWA靶场搭建及错误解决教程

前言 DVWA(Damn Vulnerable Web Application)靶场是一个旨在帮助安全人员和开发人员学习和提高网络安全技能的开源项目。它是一个故意存在多种安全漏洞的 PHP/MySQL 网络应用程序,通常用于学习和测试各种网络攻击技术 工具下载链接:https://pan.quark.cn/s/49ef556eb32b 搭…

招行面试:万亿GB网盘, 从0到1设计,如何实现?

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

代码随想录——动态规划01背包

暴力:每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 二维dp数组01背包确定dp数组及下标含义 dp[i][j]表示前…

2024-2025-1 学号20241315《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 <写上具体方面>《C语言程序设计》第13-14章并完成云班课测试作业正文 https://www.cn…

2024-2025-1 20241415《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241415《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 自学《C语言程序设计》第13-14章作业正文 https://www.cnblog…

kubectl 命令行快速操作-2

9、对外暴露服务 参考:详解kubernetes五种暴露服务的方式 - 滴滴滴 - 博客园 前面只介绍了Nodeport方式,还有NodePort、LoadBalancer、ExternalName、Ingress方式,重点讲解Ingress方式。 nginx-ingress:GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for K…