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

相关推荐

  • JetBrains全家桶激活破解教程

    所有JetbBrains软件的破解方法是一致的,区别在于激活码不同。 所以在使用前,请确保破解补丁已安装成功 注:以下所有激活码,必须配合破解补丁使用,否则会提示key is valid. 永久破解教程: 破解图文教程:https://www.it1024doc.com/4100.html IntelliJ IDEA激活码 XIZQAN09CR-eyJsaW…

    未分类 2024 年 6 月 22 日
    6.6K00
  • 成为百万架构师的第一课:设计模式:Spring中的设计模式

    本文原文地址 Spring5 源码分析 一·、Spring 中常用的设计模式 1.我们通常说的23种经典设计模式: 分类 设计模式 创建型 工厂方法(Factory Method)、抽象工厂模式(Abstract Facotry)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton) 结构型 适配器模式(Adapter…

    2025 年 1 月 6 日
    56600
  • Discord技术架构调研(IM即时通讯技术架构分析)

    一、目标 调研 discord 的整体架构,发掘可为所用的设计思想 二、调研背景 Discord作为目前比较火的一个在线聊天和语音通信平台且具有丰富的功能。另外其 “超级”群 概念号称可支持百万级群聊 以及 永久保留用户聊天记录。探究其相关技术架构与技术实现 三、产品介绍 目前广泛使用的在线聊天和语音通信平台。最初于2015年发布,旨在为游戏社区提供一个交流…

    2025 年 1 月 14 日
    46000
  • MySQL 优化利器 SHOW PROFILE 的实现原理

    背景 近期,我遇到了一个案例,涉及到通过可传输表空间的方式导入一个体积达4GB的表,整个过程耗时13分钟。通过使用PROFILE进行性能分析,意外发现大部分时间都耗费在了System lock阶段。 mysql> set profiling=1; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> a…

    未分类 2024 年 12 月 27 日
    47600
  • 一文搞懂架构设计的衡量标准:功能性、可用性、性能、可扩展性、安全性、协作效率、复杂度、成本效益

    大家好,我是汤师爷~ 架构设计的首要目标是服务于业务需求。因此,我们不应该盲目追求所谓的”最厉害的”架构,而应该致力于寻找最适合当前业务环境和未来发展需求的架构方案。 衡量架构的合理性是一个复杂的过程,需要从多个角度进行全面评估。主要可以从以下视角进行分析: 功能需求视角:评估架构是否有效支撑当前业务需求,并具有充分的灵活性以适应未来业务发展。 非功能需求视…

    未分类 2025 年 1 月 16 日
    50300

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信