1.问题描述
1.1 报错日志
今天在使用Redis插入值时遇到报错
Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer;
nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [java.util.ArrayList$SubList]
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException:
Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type
[java.util.ArrayList$SubList]
1.2 使用场景
先用List<String> list = getStudentList();
然后调用toolRedis.set("longKey", list , 60L);
就会出现上述报错
看到这个错误首先第一想法想到没有继承Serializable
,经查已经继承。
2.问题原因
仔细查看报错日志,看到[java.util.ArrayList$SubList]
,意识到我在getStudentList()
时使用了list = list.subList(0,5);
。
调试到subList方法,看见了没!!!
他new SubList(this, 0, fromIndex, toIndex);
这里是new了一个SubList
,而SubList是ArrayList的内部类,这个内部类并没有实现Serializable
在看ArrayList是实现了java.io.Serializable
的。
3.问题解决
截取换成stream()的skip
dataList = dataList.stream()
.skip(0) // 偏移量
.limit(5) // 截取量,页大小
.collect(Collectors.toList());
OK~ 问题解决
文文的博客:博学躬行。欢迎指正~