import java.io.*;
import java.lang.reflect.Field;
public class MyObjectInputStream extends ObjectInputStream {
protected MyObjectInputStream() throws IOException, SecurityException {
super();
}
public MyObjectInputStream(InputStream arg0) throws IOException {
super(arg0);
}
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
try {
System.out.println(">>>" + desc.getName());
if (desc.getName().contains("MyList")) {//LimitQueue
return Class.forName(Comm.UID1);//Comm.UID
} else if (desc.getName().contains("MyObject")) {//MBar
return Class.forName(Comm.UID2);//Comm.UID
} else {
return Class.forName(desc.getName());
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
System.out.println(ex);
}
return super.resolveClass(desc);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
ObjectStreamClass desc = super.readClassDescriptor();
System.out.println(">>>desc>>>" + desc);
// desc.getClass().getDeclaredField()
if ((desc.getName().contains("MyList") || desc.getName().contains("MyObject")) && desc.getSerialVersionUID() != 1) {
Field field = null;
try {
field = desc.getClass().getDeclaredField("suid");
field.setAccessible(true);
field.set(desc, 1L);
System.out.println("change desc:" + desc);
// desc.suid=1l;
} catch (Exception e) {
e.printStackTrace();
}
}
return desc;
}
}
先記錄下代碼,最近需要處理一個反序列化對象,package名稱變更的問題,package的變更導致無法反序列化讀取數據,通過繼承ObjectInputStream,重寫resolveClass,來欺騙下編譯器,連鎖反應是,發現package變更后,serialVersionUID也變更了,而之前沒顯式指定,又是一個坑.
閱讀源碼后,修改readClassDescriptor方法里的獲取類描述的數據,再次欺騙下,搞定,記錄下.for 老Y同志 哈.
