爱吃橙子的博客

一些工作中的经历分享

Java 反序列化时对象包名改变

开发中经常会使用到ObjectInputStream进行对象的反序列化,这时如果对象的包名发生改变,程序就会报java.lang.ClassNotFoundException。在包名不能改变的情况下,我们只能在反序列化时把序列化前的对象强制转换成当前项目下的对象。

这时我们可以自己实现一个ObjectInputStream,然后重写resolveClass方法,具体代码如下

public class MyObjectInputStream extends ObjectInputStream {
    
    
	protected MyObjectInputStream() throws IOException, SecurityException {
		super();
	}

	public MyObjectInputStream(InputStream arg0) throws IOException {
		super(arg0);
	}

	protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException{
            String name = desc.getName();
            try {
            
                if(name.startsWith("com.aaa.Test"))
                    name = name.replace("com.aaa", "com.bbb");
            
                return Class.forName(name);
            
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
        
            return super.resolveClass(desc);
        }
}

另外在使用共享缓存,如Redis时。多个项目使用一个缓存,我们不能保证对象在每个项目中的包名都是一样的。这时只能在需要的项目中这样单独处理

            
阅读更多
个人分类: 个人经验
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Java 反序列化时对象包名改变

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭