文章目录
前言
serialVersionUID变化后,反序列化失败(实体类的serialVersionUID被修改或没有设置serialVersionUID,实体类属性有变更)
记录遇到的问题,不保证正确。
一、序列化、反序列化
二、解决方法
实现ObjectInputStream类,重写readClassDescriptor方法
class DecompressibleInputStream extends ObjectInputStream {
public DecompressibleInputStream(InputStream in) throws IOException {
super(in);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();
Class localClass;
try {
localClass = Class.forName(resultClassDescriptor.getName());
} catch (ClassNotFoundException e) {
return resultClassDescriptor;
}
ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
if (localClassDescriptor != null) {
final long localSUID = localClassDescriptor.getSerialVersionUID();
final long streamSUID = resultClassDescriptor.getSerialVersionUID();
if (streamSUID != localSUID) {
try {
Field suid = resultClassDescriptor.getClass().getDeclaredField("suid");
suid.setAccessible(true);
suid.set(resultClassDescriptor, localSUID);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return resultClassDescriptor;
}
}
使用