反序列化對象時處理package和serialVersionUID不一致


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM