zoukankan      html  css  js  c++  java
  • 反序列化对象时处理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同志 哈.

  • 相关阅读:
    BZOJ4416 SHOI2013阶乘字符串(状压dp)
    雅礼集训 Day2 T3 联盟 解题报告
    雅礼集训 Day1 T2 折射
    雅礼集训 Day1 T1 养花
    P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
    洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
    动态MST
    洛谷 P2606 [ZJOI2010]排列计数 解题报告
    牛客 2018NOIP 模你赛2 T2 分糖果 解题报告
    洛谷 P3396 哈希冲突 解题报告
  • 原文地址:https://www.cnblogs.com/madgoat/p/12490990.html
Copyright © 2011-2022 走看看