首页 > 其他分享 >JSON字符串反序列化 动态泛型

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

时间:2024-12-29 11:53:45浏览次数:6  
标签:obj json entity JSON 泛型 new 序列化 objectMapper

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

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

目标方法时这样的:

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

 

标签:obj,json,entity,JSON,泛型,new,序列化,objectMapper
From: https://www.cnblogs.com/cjsblog/p/18460884

相关文章

  • 谈谈JSON
    中文名:JS键值对数据        英文名:JavaScriptObjectNotationJSON是一种常用的数据格式,其简洁和清晰的层次结构有效地提升了网络传输效率,很多编程语言都支持JSON格式的数据交换。JSON相比于 XML来说,更小、更快,更易解析。JSON数据{"kind":"grape",......
  • DRF之序列化器【3】数据校验
    目录前言1.基本校验2.内置和正则校验3.钩子校验4.Model校验5.保存数据之普通字段6.保存数据之FK和M2M字段7.数据校验总结总结前言在前两篇文章我们已经介绍了序列化器的序列化数据的功能以及源码实现,本文将接着介绍它的数据校验功能以及数据保存。序列化器......
  • 应用层修复大语言模型(LLMs)输出异常 JSON 通用解决方案
    摘要:在应用集成大语言模型逐步深入的过程中,对于以JSON为代表的结构化数据输出逐步成为核心用例。在模型无法保证100%生成正确JSON输出的当下,应用层是否有一套能够适配多语言,多种结构化格式,同时提供更为健全修复能力的方案?本文结合个人经验,提出了一个基于ANTLR的修复方......
  • 泛型,泛型约束
    什么是泛型?泛型(Generics)是一种编程技术,广泛应用于面向对象编程(OOP)中,特别是在C#、Java等现代编程语言中。泛型的核心思想是创建可以在多种数据类型上工作的类、接口和方法,而不需要为每种数据类型单独编写代码。这不仅提高了代码的重用性,还增强了类型安全性,减少了运行时错误。泛......
  • 轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一
    轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,cocojson,vocxml格式的标注,一共785张采集图片 数据集分割训练组90%        706图片有效集6%    46图片测试集4%        33图片预处理调整大小: 拉伸至640x640自......
  • Oracle WebLogic Server反序列化漏洞(CVE-2024-21216)
    免责声明请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自行承担,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。一、简介WebLogic是一款由BEA系统公司开发的JavaEE应用服务器,现由Oracle......
  • UE4.27, 揣摩源码, 序列化 (二) FBitReader, FBitWriter
    2. 继续看bit序列化,这个设计是网络传输的关键一环//FBitReader, FBitWriter这两个类仅被网络相关的事务使用//Thisclassisexclusivelyusedbythenetcode2.1.SVO和array的正反序列化相同,内部都存在着,对类型是TAarry<uint8>的字节单位的内存的处理......
  • UE4.27, 揣摩源码, 序列化 (一) FArrayReader, FArrayWriter
    1.从ArrayReader.h和ArrayWriter.h开始1.1.SVO为了减少误解,介绍一下SVO这里的read和write的主词都是array,宾语都是memory所以前者是从内存读出array,后者是将array写入内存1.2.关键继承关系FArrayReader,FArrayWriterc......
  • C#知识整理-泛型
    泛型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。泛型的优点包括:代......
  • DRF之序列化器【2】源码流程
    目录前言1.流程概述2.创建字段对象3.创建类4.实例化类5.序列化过程5.1UserSerializer类5.2ListSerializer类6.总结前言序列化器是Django框架中的一个重要概念,用于在Python对象和JSON等格式之间进行相互转换。通过序列化器,我们可以方便地将模型实例转换为JS......