惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
罗磊的独立博客
腾讯CDC
云风的 BLOG
云风的 BLOG
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
U
Unit 42
I
InfoQ
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
GbyAI
GbyAI
S
SegmentFault 最新的问题

博客园 - MadGoat

修改ant-degisn-vue源码实现月范围开始结束可选同一个月 右键刷新弹出网页广告的解决办法 我的黑莓电子书阅读解决方案 我的BB8700的新伙伴-JABRA BT135蓝牙耳机 XP系统无法出现关机界面的解决一例 关于WINDOWS XP登陆的几个技巧 - MadGoat - 博客园 教你建一个别人打不开的文件夹 开始菜单只剩下经典模式了 任务栏无任务显示的问题 [转载]淮北方言集锦 七八十年代人儿时的玩具 浏览网页右键快速保存内容的小脚本 TatuGIS 破解笔记 NativeExcel 破解笔记 - MadGoat - 博客园 可恶的硬件故障(已解决) 推荐大学自习室后的《再见大四》 美国独立电影人制作的纪录片《南京梦魇——南京大屠杀》 再次推荐SQLPrompt3 -简单破解无限期的使用这款很不错的SQL查询分析工具 用户中心 - 博客园
反序列化对象时处理package和serialVersionUID不一致
MadGoat · 2020-03-14 · via 博客园 - MadGoat
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同志 哈.