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中序列化的数据:
Java中redis反序列化复杂结构对象异常记录(具有内部类的对象,具有List成员的对象)_第1张图片

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

处理办法:

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

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

你可能感兴趣的:(java基础,java,开发语言,后端,redis)