开发中经常会使用到ObjectInputStream进行对象的反序列化,这时如果对象的包名发生改变,程序就会报java.lang.ClassNotFoundException。在包名不能改变的情况下,我们只能在反序列化时把序列化前的对象强制转换成当前项目下的对象。
这时我们可以自己实现一个ObjectInputStream,然后重写resolveClass方法,具体代码如下
public class MyObjectInputStream extends ObjectInputStream {
protected MyObjectInputStream() throws IOException, SecurityException {
super();
}
public MyObjectInputStream(InputStream arg0) throws IOException {
super(arg0);
}
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{
String name = desc.getName();
try {
if(name.startsWith("com.aaa.Test"))
name = name.replace("com.aaa", "com.bbb");
return Class.forName(name);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return super.resolveClass(desc);
}
}
另外在使用共享缓存,如Redis时。多个项目使用一个缓存,我们不能保证对象在每个项目中的包名都是一样的。这时只能在需要的项目中这样单独处理