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 日

相关推荐

  • ChatGPT Plus充值原账号升级教程

    不少用户搜索 ChatGPT Plus 充值,是因为官方订阅入口处理起来不方便。卡密方式的重点是先用国内支付购买,再用 Session 确认当前账号。 整个过程不需要共享账号,重点是卡密和账号信息核对。

    未分类 2026 年 6 月 5 日
    15800
  • Claude Pro支付宝续费国内教程

    Claude Pro支付宝续费国内教程,适合Claude Pro 老用户,重点说明支付宝、账号核对和有效期更新。

    未分类 2026 年 5 月 20 日
    25100
  • ChatGPT Plus自己账号订阅教程

    很多资料整理用户不是不会用 ChatGPT,而是卡在 Plus 订阅付款上。国内用户如果想用自己的原账号,直接走官方订阅会比较麻烦。本文保留原来的自助充值流程,适合想用自己账号开通 Plus、后续用于写作改稿的人。

    未分类 2026 年 7 月 6 日
    15400
  • ChatGPT Plus充值怎么确认目标邮箱

    在确认页面逐字核对邮箱,不一致时先停止并重新登录目标账号。国内用户处理如何确认目标邮箱时,重点是把支付环节和账号识别环节分开。围绕“如何确认目标邮箱”,前者解决付款方式,后者决定会员最终开到哪个账号。

    未分类 6天前
    3500
  • Claude Pro充值无需国外信用卡

    国内用户开通Claude Pro的无需国外信用卡说明,保留Claude充值、Claude代充和Organization ID确认流程,适合需要微信支付宝付款的用户。

    未分类 2026 年 6 月 2 日
    23700

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信