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

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

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

目标方法时这样的:

```
CommandResp sendXXX(BaseCommandApiDTO 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类型的)建议单独存一张关联表

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5015.html

(0)
LomuLomu
上一篇 2024 年 12 月 31 日
下一篇 2024 年 12 月 31 日

相关推荐

  • 【Java多线程】如何使用Java多线程下载网络文件 断点续传

    如何使用Java多线程下载网络文件,并实现断点续传 在现代网络应用中,多线程下载是一种常见的技术,它可以显著提高下载速度并提供更好的用户体验。本篇文章将介绍如何使用Java实现多线程下载,并结合项目中的代码作为示例进行讲解。 1. 多线程下载的基本原理 多线程下载的基本思想是将一个文件分成多个部分,每个部分由一个线程独立下载,最后将这些部分合并成完整的文件。…

    未分类 2025 年 1 月 11 日
    48400
  • Redis Java 集成到 Spring Boot

    # Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~ ## 📚 本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 ![在这里插入图片描述](https://pic.it1024doc.com/csdn/202412/ca054e533844dc927c24e57c1713f…

    2024 年 12 月 27 日
    51000
  • Java内存泄漏问题的高效排查与优化指南

    目录导航1. 系统化诊断与优化框架2. 内存快照获取技术2.1 自动生成堆转储文件2.2 手动创建堆转储文件3. 专业分析工具应用3.1 内存分析工具MAT3.2 性能分析工具JProfiler3.3 企业级专用工具4. 深度排查内存泄漏4.1 内存差异对比分析4.2 可疑泄漏对象检测4.3 内存占用大户识别4.4 不可达对象追踪5. 问题确认与验证6. 代…

    2025 年 5 月 13 日
    36700
  • 免费PDF合并工具使用指南

    引言 各位朋友好,我是技术分享者小徐。在日常的Java开发工作中,PDF文档处理是常见需求。高效处理PDF文件能显著提升我们的工作效率。当需要将多个PDF文档整合为一个时,很多工具要么收费要么操作复杂。今天为大家介绍一款简单易用的免费PDF处理工具。 零成本实现PDF合并 第一步:通过微信搜索功能,输入”PDF助手”进行查找,认准下方展示的小程序图标进入。也…

    2025 年 5 月 15 日
    40900
  • 深入理解 Java 接口的回调机制

    前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末JAVA编程考了回调,小编不会。 一、什么是回调? 回调(Callback) 是指通过将一个方法作为参数传递给另一个方法,在某些…

    2025 年 1 月 12 日
    46200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信