java,反序列化的時候修改了類的包
阿新 • • 發佈:2019-01-30
資料庫存了一些老框架序列化的位元組碼,由於程式碼遷移到新框架,所以修改了一些類的路徑(即就是包名被修改了),導致反序列化這些位元組碼的時候拋ClassNotFound異常(如果包名一致不存在反序列化拋異常)。
byte[] dataBytes = getBytes(); ByteArrayInputStream in = new ByteArrayInputStream( dataBytes ); ObjectInputStream objIn = new ObjectInputStream( in ); objIn.readObject(); // 這裡會拋NotFoundException
現在可以通過重寫ObjectInputStream中方法的方式解決這個問題,程式碼如下:
新建一個類繼承ObjectInputStream, 並重寫resolveClass()方法
public class MyObjectInputStream extends ObjectInputStream { private static Logger logger = LoggerFactory.getLogger( MyObjectInputStream .class ); private static final String OLD_PACKAGE = "com.abc.test"; private static final String NEW_PACKAGE = "com.test"; public MyObjectInputStream ( InputStream arg0 ) throws IOException { super( arg0 ); } @Override public Class< ? > resolveClass( ObjectStreamClass desc ) throws IOException, ClassNotFoundException { String name = desc.getName(); try { if ( name.startsWith( OLD_VISION_PACKAGE ) ) { name = name.replace( OLD_VISION_PACKAGE, NEW_VISION_PACKAGE ); return Class.forName( name ); } } catch ( ClassNotFoundException ex ) { logger.warn( ex.getMessage() ); } return super.resolveClass( desc ); } }
呼叫的時候替換ObjectInputStream 為這個MyObjectInputStream就行
byte[] dataBytes = getBytes();
ByteArrayInputStream in = new ByteArrayInputStream( dataBytes );
MyObjectInputStream objIn = new MyObjectInputStream( in );
objIn.readObject();