问题描述

先看实体类:

import com.fasterxml.jackson.annotation.*;
import lombok.Data;
import org.jeecg.common.system.base.entity.JeecgEntity;
import org.jeecg.modules.iot.entity.jackson.WorkerConverter;
import org.jeecg.modules.iot.entity.jackson.WorkersDeserializer;
import org.jeecg.modules.iot.entity.jackson.WorkersSerializer;import java.io.Serializable;
import java.util.List;@Data
public class Mechanical extends JeecgEntity {//父类也实现了Serializableprivate String deviceId; //设备编号//...其他字段略//我是问题字段//@JsonSerialize(using = WorkersSerializer.class)//@JsonDeserialize(contentConverter = WorkerConverter.class)private List<Worker> workers;//我是内部类@Datapublic static class Worker implements Serializable {private static final long serialVersionUID = 1L;private String deviceId;//...其他字段略}}

以上实体类中,定义了静态内部类:Worker,作为Mechanical的列表泛型参数,通过Jackson序列化后的标识如下:

可以看到,List<Worker> 这个字段,List的标识为"ArrayList",是正确的,但传入的泛型参数(自定义内部类Worker)被序列化成了"LinkedHashMap",因此在通过Jackson进行反序列化时,将会抛出异常:

Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'java.util.LinkedHashMap' as a subtype of [simple type, class org.jeecg.modules.iot.entity.Mechanical$Worker]: Not a subtype ...

问题解决

第一时间我想到的是通过自定义序列/反序列化去解决:

  • @JsonSerialize(using = WorkersSerializer.class) //使用自定义的序列化器,无效
  • @JsonDeserialize(using = WorkersUnserializer.class) //使用自定义的反序列化器,无效
  • @JsonDeserialize(contentConverter = WorkerConverter.class) //使用自定义的反序列化转化器,导致了堆栈内存溢出,原因未知。。

PS:以上注解可以去这里学习:Jackson JSON - Using @JsonSerialize and @JsonDeserialize with Converter for custom conversion

各种方式都尝试了,但是问题仍未解决。。脑壳疼,喝口水冷静一下,重新去思考问题的出现原因:序列化的识别码不同,嗯~ o( ̄▽ ̄)o?

好家伙,继续Google,在参考大量文章后,两个注解吸引了我的注意力:

  • @JsonTypeInfo,第一感觉,貌似能描述序列化类型?
  • @JsonSubTypes,这个和上面老哥配套的,貌似用于处理多态环境下的序列化

紧接着,光速去啃一下这俩注解原理和使用,这里非常感谢 @MicoCube 的文章:Java Jackson @JsonTypeInfo 多态类型处理 ,快速扫完后,大概有了思路:通过上面的注解去自定义Jackson序列化的类标识符,Now Do it!

修改前面实体类中出现问题的字段,添加以下注解:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,property = "mytype", include=JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({ //设置对应子类的识别码值@JsonSubTypes.Type(value = LinkedHashMap.class, name = "worker"),@JsonSubTypes.Type(value = Worker.class, name = "worker")
})
private List<Worker> workers;

通过上面魔法般的操作,让我们现在来看看Jackson序列化的标识符:

怎么样,淘气鬼完全被我们控制住了,标识符类型为我们的"mytype",标识值也成了固定值"worker",这下大功告成~尽情的序列/反序列化吧!

总结

还是尽量避免使用内部类!当然这个坑硬爬完了就算了。。肚子好饿,该吃饭了QAQ

解决:Jackson反序列化Java内部类失败(序列化后的识别码为LinkedHashMap,而非内部类本身)相关推荐

  1. java return 1 wex5_求大神解决****ERROR****: 子任务 java 执行失败。

    开始...... 保存配置信息: init 编译UI资源: 开始...... [JUSTEP_HOME in UIServer]: E:\WeX5_V3.6\WeX5_V3.6 2017-04-12 ...

  2. 为啥你用@JsonFormat注解反序列化LocalDateTime总失败?

    点击上方蓝色"冰河技术",关注并选择"设为星标" 持之以恒,贵在坚持,每天进步一点点! 作者个人研发的在高并发场景下,提供的简单.稳定.可扩展的延迟消息队列框架 ...

  3. 升级SpringCloud到Hoxton.SR3后使用Fegin出现jackson反序列化失败,源码分析,原因lombok版本升级

    关键词 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct insta ...

  4. 程序验证Jackson反序列化的规则、Jackson序列化与反序列化关键方法程序详细分析

    目录 0. 为什么要做这个分析 1. Jackson反序列化时,无参构造.有参构造的执行顺序[附程序截图] 1.1 没有无参构造时: 1.2 无参构造和有参构造方法都有的时候先走无参构造: 2. Ja ...

  5. java restfulapi 返回文件base64_Java反序列化:一次构造后Ysoserial Payload

    前言 在一次应用安全测试中发现了一个的Java反序列化漏洞,该漏洞最终导致未经身份验证的远程代码执行.经过实践,发现利用此漏洞并不像之前使用Ysoserial生成默认payload那样简单. 所以在本 ...

  6. hutol json null值没了_JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法...

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  7. java对象的序列化和反序列化详细解释

    java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...

  8. Java JSON时间处理 Jackson 的时间操作 时间序列化 Jackson Date

    原文链接:Jackson Date 1. Overview 概述 In this tutorial, we'll serialize dates with Jackson. We'll start b ...

  9. Java XML解析: 序列化 反序列化

    Java解析XML的类库很多,本文记录用XStream库对XML的处理 背景 实际开发中,应用报文的格式一般都是JSON和XML:JSON大家都很熟悉(优秀类库:GSON/FastJson/Jacks ...

最新文章

  1. 【廖雪峰python入门笔记】列表生成式
  2. 越来越多杂志用webp存储图像,这个工具可以在线转成PNG
  3. Wedding UVA - 11294(2-SAT男女分点)
  4. python json.loads()中文问题-python处理json数据中的中文
  5. Reproducible Research in Computational Science
  6. AGG第七课 内存分配策略
  7. (48)逆向分析 KiFastCallEntry 函数填充 _KTRAP_FRAME 部分
  8. oracle一行拆多行函数,Oracle 实现多行转换成一行 使用oracle 10g collect函数
  9. 手动创建两个文本文件text1.txt和text2.txt,按要求创建text3.txt
  10. postgis 导出 栅格_postgis常见的空间数据的导入导出
  11. 使用javamail 发送邮件
  12. linux指法教程,Linux的vim的使用
  13. MySQL的两个存储引擎--MyISAM和InnoDB
  14. JAVA微信扫码支付模式二功能实现完整例子
  15. 无法拯救的 Wear OS!
  16. nginx php上传配置
  17. CSS 字体单位大小对照换算表
  18. 海康威视摄像头使用:iVMS-4200 VS客户端
  19. 433MHz自发电无线控制器
  20. deepin linux连接不上网络,把Deepin升级到15.8桌面版后无线上不了网的解决方法

热门文章

  1. 基于STM32F103芯片实现LED灯闪烁
  2. 2011年国外最受欢迎的15个汽车网站
  3. 关于SBUF读两次的问题
  4. Rosalind Java| Counting Point Mutations
  5. 阿里云ACP认证有用吗?
  6. 赛尔无人机 | 航测新标杆 Phantom 4 RTK
  7. html5怎么设置路由器,无线路由器
  8. 联合概率和条件概率的区别和联系
  9. flutter基础 dart语言学习笔记
  10. ultravnc 设置代理_云立方IP丨IP代理可以实现哪些功能?