【发布时间】:2011-08-09 16:38:07
【问题描述】:
我想编写代码,即使类被更改(但你有旧的类版本)也可以反序列化类。
这个想法很简单。
- 读取序列化类的
serialVersionUID - 检查
serialVersionUID是否等于当前类版本的serialVersionUID。 - 如果没有,请创建新的
ClassLoader并将旧的类版本加载到工作区中。
我想用这样的东西:
FileInputStream file = new FileInputStream(filename);
ObjectInputStream o = new ObjectInputStream(file) {
protected Class<?> resolveClass(java.io.ObjectStreamClass desc) throws IOException, ClassNotFoundException {
//5639490496474438904L is the suid of the older version
if (desc.getSerialVersionUID() == 5639490496474438904L) {
Class c01 = null;
URL eineURL = new URL("file://localhost/U:/MyJavaProj/bin/test/oldversion/");
URL[] reiURL = new URL[] {eineURL};
URLClassLoader clazLader = new URLClassLoader(reiURL);
c01 = clazLader.loadClass("test.SerObj");
return c01;
}
return super.resolveClass(desc);
}
};
SerObj obj = (SerObj) o.readObject();
问题出在最后一行。我当前的班级版本放在 U:/MyJavaProj/bin/test/SerObj.class 我的旧类版本放在U:/MyJavaProj/bin/test/oldversion/test/SerObj.class
在最后一行中,我阅读了旧的课程版本,但将其转换为新版本:(
有没有人知道或可能有其他方法来为 Java 中的序列化添加版本控制支持?
【问题讨论】:
-
究竟是什么问题 - 你能提供异常堆栈跟踪吗?
-
线程“main”java.lang.ClassCastException 中的异常:test.SerObj 无法转换为 test.SerObj :)
标签: java serialization versioning classloader