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

推荐订阅源

D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
B
Blog RSS Feed
H
Help Net Security
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
L
LangChain Blog
Vercel News
Vercel News

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