java.io.InvalidClassException: com.xxx.xxx;

Yang_SH / 108 / 2023-09-25 14:20:08

ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz

InvalidClassException

异常经过

类A在系统使用ehcache作为缓存,现在A类中新增的一个字段aa;
新增后启动项目后报错:java.io.InvalidClassException: xxx.xxx.xxx; local class incompatible: stream classdesc serialVersionUID = xxx, local class serialVersionUID = xxx;,报错的大概意思是缓存中serialVersionUID的与本地类不兼容;
经过检查发现A类实现了Serializable却没有定义出serialVersionUID,导致缓存在验证serialVersionUID时前后不一致抛出异常;

这里需要解释一下:类没有显式声明serialVersionUID字段,则Java运行时系统将根据类的各种详细信息自动生成一个serialVersionUID

解决办法

既然原来会生成一个serialVersionUID,那么我们获取到原来的serialVersionUID再给类设置上去,就保证一致了。

通过报错信息里面就可以获取原来的serialVersionUID
或者通过下面的代码获取

ObjectStreamClass sc = ObjectStreamClass.lookup(A.class);
long ASerialVersionUIDserialID = sc.getSerialVersionUID();
System.out.println("A: " + ASerialVersionUIDserialID);//这里就是获取到的serialVersionUID

注意:这里A类必须时修改之前的模样,可以通过git、svn等工具获取;

还有就是实现了Serializable一定要加上serialVersionUID,没事不要乱动serialVersionUID

private static final long serialVersionUID = XXXL;

java.io.InvalidClassException: com.xxx.xxx;
作者
Yang_SH
许可协议
CC BY 4.0
发布于
2023-09-25
修改于
2024-06-19
Bonnie image
尚未登录