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中序列化的数据:
处理办法:
- 重新new一个ArrayList即可:
list = new ArrayList<>(list.subList(0, 10));
然后在执行序列化和反序列化就没有问题了