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同志 哈.