共计 843 个字符,预计需要花费 3 分钟才能阅读完成。
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;
正文完