Java中redis反序列化复杂结构对象异常记录(具有内部类的对象,具有List成员的对象)

Java中redis反序列化复杂结构对象异常记录(具有内部类的对象,具有List成员的对象)

1. 具有内部类的对象

@Getter
@Setter
public class ScrnSupNetDto {

    private Integer enabledDockPlatCount;
    
    private Integer enableTradePlatCount;
    /// 前五名数据
    private List<TradePlatData> top5Data;

    @Getter
	@Setter
    public class TradePlatData {
        
        private String platName;
        
        private Integer totalEachCount;
        
        private String lastEachTime;
    }
}

最开始的对象结构,包含List成员变量和内部非静态类,在从redis取出数据进行反序列化时出现异常:

non-static inner classes like this can only by instantiated using default, ...

原因是: 内部非静态类无法实例化,内部非静态类依赖于实例,只有实例创建的时候才会加载内部类。内部费静态类无法实例化,无法提供可访问的默认无参构造函数。

处理办法:
  • 改为静态内部类
  • 内部类需提供一个无参构造函数
@Getter
@Setter
public class ScrnSupNetDto implements Serializable {

    private static final long serialVersionUID = 4044075552086651089L;
    
    private Integer enabledDockPlatCount;
    
    private Integer enableTradePlatCount;
    
    private List<TradePlatData> top5Data;

    @Getter
    @Setter
    public static class TradePlatData {
        
        private String platName;
        
        private Integer totalEachCount;
        
        private String lastEachTime;

        public TradePlatData() {
        }
    }
}
2. List成员变量反序列化

List成员变量需要注意的是,在序列化之前List不能再次调用subList方法,此方法返回的是SubList,是List的一段视图,是ArrayList的内部类,无法实例化,反序列化失败。

redis中序列化的数据:
redis中序列化的数据

在这里插入图片描述

处理办法:
  • 重新new一个ArrayList即可:
list = new ArrayList<>(list.subList(0, 10));

然后在执行序列化和反序列化就没有问题了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值