java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java反序列化serialVersionUID不一致

java反序列化serialVersionUID不一致问题及解决

作者:sinat_28114651

文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,以及实体类属性有变更时,文章提出了解决方法,通过实现`ObjectInputStream`类并重写`readClassDescriptor`方法来处理这些问题

前言

serialVersionUID变化后,反序列化失败(实体类的serialVersionUID被修改或没有设置serialVersionUID,实体类属性有变更)

记录遇到的问题,不保证正确。

一、序列化、反序列化

二、解决方法

实现ObjectInputStream类,重写readClassDescriptor方法

class DecompressibleInputStream extends ObjectInputStream {
    
public DecompressibleInputStream(InputStream in) throws IOException {
    super(in);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
    ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();
    Class localClass;
    try {
        localClass = Class.forName(resultClassDescriptor.getName());
    } catch (ClassNotFoundException e) {
        return resultClassDescriptor;
    }
    ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
    if (localClassDescriptor != null) {
        final long localSUID = localClassDescriptor.getSerialVersionUID();
        final long streamSUID = resultClassDescriptor.getSerialVersionUID();
        if (streamSUID != localSUID) {
            try {
                Field suid = resultClassDescriptor.getClass().getDeclaredField("suid");
                suid.setAccessible(true);
                suid.set(resultClassDescriptor, localSUID);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return resultClassDescriptor;
}

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文