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

火影  金牌会员 | 2024-12-29 10:10:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

需求:定时任务扫描,反射调用目的对象,但是,方法的传参不是固定的。
方案一:将方法参数存成JSON字符串,然后JSON反序列化成对象,然后反射调用
目的方法时如许的:
  1. CommandResp sendXXX(BaseCommandApiDTO<XXX> baseCommandApiDTO);
复制代码
方式一:FastJson
  1. Class mainBody = Class.forName(entity.getMainBodyType());
  2. ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(new Type[]{mainBody}, null, BaseCommandApiDTO.class);
  3. Object obj = JSON.parseObject(entity.getMsgText(), parameterizedType);
  4. CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);
复制代码
方式二:Jackson
  1. public class ObjectMapperHolder {
  2.     private static final ObjectMapper objectMapper = new ObjectMapper();
  3.     public static ObjectMapper getObjectMapper() {
  4.         objectMapper.registerModule(new Jdk8Module());
  5.         objectMapper.registerModule(new JavaTimeModule());
  6.         return objectMapper;
  7.     }
  8. }
  9. ObjectMapper mapper = ObjectMapperHolder.getObjectMapper();
  10. JavaType javaType = mapper.getTypeFactory().constructParametricType(BaseCommandApiDTO.class, mainBody);
  11. Object obj = mapper.readValue(entity.getMsgText(), javaType);
  12. CommandResp resp = ReflectUtil.invoke(serviceObj, methodName, obj);
复制代码
实践中发现,这两种方式容易导致OOM
方案二:直接将参数对象存到数据库中
数据库对应字段设置BLOB类型(这里设置的是MEDIUMBLOB) ,对应的java字段类型是byte[]
  1. //  写入对象
  2. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  3. ObjectOutputStream oos = new ObjectOutputStream(bos);
  4. oos.writeObject(baseCommandApiDTO);
  5. oos.flush();
  6. byte[] data = bos.toByteArray();
  7. //  读取对象
  8. ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(entity.getMsgObj()));
  9. Object obj = ois.readObject();
复制代码
末了的末了,优化建议:
1、尽量不要在数据库中存json字符串,如果非要存,建议字段类型设置为json,如许可以节省空间。由于你无法控制json字符串的长度,所以长度设置是个问题,另外json反序列化比较占内存。
2、长度很大的字段(比如blob类型的)建议单独存一张关联表
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表