如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN

问题

我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误

java 复制代码
java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 9031463779199124957, local class serialVersionUID = -3889253203225845868

我很确定我的库仍然与外部系统兼容,所以我尝试使用 javassist 修改本地 com.essbase.api.base.EssException 的 serialVersionUID

java 复制代码
CtClass cc = pool.get("com.essbase.api.base.EssException");
cc.defrost();
CtField serialField=new CtField(CtClass.longType, "serialVersionUID",cc);
serialField.setModifiers(Modifier.PRIVATE);
serialField.setModifiers(Modifier.STATIC);
serialField.setModifiers(Modifier.FINAL);        
cc.addField(serialField, CtField.Initializer.constant(9031463779199124957l));

错误仍然存​​在,但它说我的本地 serialVersionUID 现在是 -7214799155395914399,所以这是在做一些事情。

有任何关于如何将我的 serialVersionUID 转变为 9031463779199124957l 的想法吗?

解决方案

我最终使它工作,将注入字段的修饰符更改为:

java 复制代码
serialField.setModifiers(Modifier.STATIC | Modifier.FINAL);

这是有效的代码,并且与服务器的通信现已恢复:

java 复制代码
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new ClassClassPath(MainTest.class));
CtClass cc = pool.get("com.essbase.api.base.EssException");
cc.defrost();
CtField serialField=new CtField(CtClass.longType, "serialVersionUID",cc);
serialField.setModifiers(Modifier.STATIC | Modifier.FINAL);
cc.addField(serialField, CtField.Initializer.constant(9031463779199124957l));
Class clazz=cc.toClass();
相关推荐
元Y亨H2 分钟前
Nacos - 服务发现
java·微服务
微露清风13 分钟前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi022714 分钟前
Java趣闻
java
阿波罗尼亚1 小时前
Tcp SSE Utils
android·java·tcp/ip
susu10830189111 小时前
springboot3.5.8整合minio8.5.9
java·springboot
不知道累,只知道类1 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
myzshare2 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序
Chan162 小时前
【 Java八股文面试 | JavaSE篇 】
java·jvm·spring boot·面试·java-ee·八股
wen__xvn2 小时前
代码随想录算法训练营DAY10第五章 栈与队列part01
java·前端·算法
独自破碎E2 小时前
解释一下NIO、BIO、AIO
java·开发语言·nio