• 反序列化对象时处理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同志 哈.

  • 相关阅读:
    Jane Austen【简·奥斯汀】
    I Like for You to Be Still【我会一直喜欢你】
    Dialogue between Jack and Rose【jack 和 Rose的对话】
    git删除远程.idea目录
    码云初次导入项目(Idea)
    DelayQueue 订单限时支付实例
    eclipse安装spring的插件
    redis安装命令
    log4j详解
    jstree API
  • 原文地址:https://www.cnblogs.com/madgoat/p/12490990.html
Copyright © 2020-2023  润新知