栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使Java运行时忽略serialVersionUID?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使Java运行时忽略serialVersionUID?

如果您有权访问代码库,则可以使用Ant的SerialVer任务来插入和修改

serialVersionUID
可序列化类的源代码,并彻底解决此问题。

如果不能这样做,或者这不是一个选择(例如,如果您已经序列化了一些需要反序列化的对象),则一种解决方案是extend

ObjectInputStream
。增强其行为,以比较
serialVersionUID
流描述符与
serialVersionUID
该描述符表示的本地JVM中的类的类,并在不匹配的情况下使用本地类描述符。然后,只需使用此自定义类进行反序列化即可。这样的东西(此消息的信用):

import java.io.IOException;import java.io.InputStream;import java.io.InvalidClassException;import java.io.ObjectInputStream;import java.io.ObjectStreamClass;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class DecompressibleInputStream extends ObjectInputStream {    private static Logger logger = LoggerFactory.getLogger(DecompressibleInputStream.class);    public DecompressibleInputStream(InputStream in) throws IOException {        super(in);    }    @Override    protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {        ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor        Class localClass; // the class in the local JVM that this descriptor represents.        try { localClass = Class.forName(resultClassDescriptor.getName());         } catch (ClassNotFoundException e) { logger.error("No local class for " + resultClassDescriptor.getName(), e); return resultClassDescriptor;        }        ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);        if (localClassDescriptor != null) { // only if class implements serializable final long localSUID = localClassDescriptor.getSerialVersionUID(); final long streamSUID = resultClassDescriptor.getSerialVersionUID(); if (streamSUID != localSUID) { // check for serialVersionUID mismatch.     final StringBuffer s = new StringBuffer("Overriding serialized class version mismatch: ");     s.append("local serialVersionUID = ").append(localSUID);     s.append(" stream serialVersionUID = ").append(streamSUID);     Exception e = new InvalidClassException(s.toString());     logger.error("Potentially Fatal Deserialization Operation.", e);     resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization }        }        return resultClassDescriptor;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486127.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号