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/4843.html

(0)
LomuLomu
上一篇 2024 年 12 月 30 日 上午4:14
下一篇 2024 年 12 月 30 日 上午4:44

相关推荐

  • 免费将PDF转换为图片的实用指南

    引言 各位朋友好,我是小徐。在日常的Java开发工作中,处理PDF文档是常见需求之一。为了提升工作效率,今天我将分享一个无需付费、无水印的PDF转图片方法。让我们一起来探索吧! 轻松实现PDF转图片(零成本) 第一步,通过微信搜索功能,输入”PDF编辑器小帮手”进行查找,认准正确的小程序图标进入。您也可以直接点击文中的小程序链接快速访问。进入后,在功能界面选…

    2025 年 5 月 15 日
    24900
  • 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。 好了,接下来我们就开始深入了解这个话题。 模型对接 我们首先需要…

    2025 年 1 月 11 日
    55500
  • python SQLAlchemy ORM——从零开始学习 01 安装库

    01基础库 1-1安装 依赖库:sqlalchemy “`python pip install sqlalchemy #直接安装即可 “` 1-2导入使用 这里讲解思路【个人的理解】,具体写其实就是这个框架: 导入必要的接口【有创建engine以及declarative_base】 通过create_engine接口创建engine,根据翻译可以翻译成引…

    2025 年 1 月 13 日
    44800
  • Postman安装及汉化操作全解(含图文步骤)

    前言 Postman 是一款功能强大的 API 测试工具,深受开发者喜爱。然而,原版 Postman 是英文界面,对于习惯中文的用户可能不够友好。本教程详细介绍如何下载安装 Postman 并成功实现汉化,适合零基础用户。 一、下载安装包 首先,获取 Postman 的安装包及对应汉化包:👉 点击获取 Postman 安装及汉化包 ⚠️ 注意事项: 1. P…

    2025 年 1 月 6 日
    96600
  • 基于ABP框架与Entity Framework(非Core版)和MySQL的大数据分页查询优化方案

    在利用ABP框架整合Entity Framework(非Core版)和MySQL处理海量数据分页查询时,需要针对MySQL的特性与EF的分页功能进行深度优化。以下为详细的实现策略与技术要点: 一、摒弃传统分页方式传统的Skip().Take()方法在EF中会被转换为LIMIT OFFSET语法,当处理百万级数据时性能表现极差。优化方案包括:1. 主键/唯一键…

    未分类 2025 年 5 月 11 日
    31000

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信