在没有serialVersionUID的情况下反序列化对象时出现问题 [英] issue while deserializing the object with no serialVersionUID

查看:145
本文介绍了在没有serialVersionUID的情况下反序列化对象时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 首先    获取   例外   -   ` 

java io InvalidClassException local class 不兼容: stream classdesc serialVersionUID = 4597316331807173261 local class serialVersionUID = -3344057582987646196`,

as `serialVersionUID` class COOKIE API HtmlUnit am 使用 exception 发生 as Cookie 已更改 因为 我们 upgrade version `HtmlUnit`, so what idea to my mind to avoid 匹配 `serialversionUID` deserialing so 尝试 < span class =code-leadattribute>解决方案 ::

I 覆盖 readClassDescriptor ObjectInputStre的class =code-leadattribute> am class this 方式

< pre lang =java> protected ObjectStreamClass readClassDescriptor() throws IOException ClassNotFoundException {
ObjectStreamClass resultClassDescriptor = super readClassDescriptor(); // 最初流描述符
localClass = Class .forName( resultClassDescriptor.getName()); // 此描述符所代表的本地JVM中的类。
if (localClass == null){
System out .println(No local class for + resultClassDescriptor .getName());
return resultClassDescriptor;
}
ObjectStreamClass localClassDescriptor = ObjectStreamClass .lookup(localClass);
如果 (localClassDescriptor != null){ // 仅当类实现可序列化
final long localSUID = localClassDescriptor getSerialVersionUID();
final long streamSUID < span class =code-leadattribute> =
resultClassDescriptor .getSerialVersionUID();
如果 (streamSUID != localSUID){ // 检查serialVersionUID不匹配。
final StringBuffer s = new StringBuffer(Overriding serialized class version mismatch );
s append(local serialVersionUID = )。append(localSUID);
s .append( stream serialVersionUID = )。append(streamSUID);
异常 e = < span class =code-leadattribute> new
InvalidClassException(s.toString());
系统 out .println(潜在致命 反序列化 操作 + e);
resultClassDescriptor = localClassDescriptor; // 使用本地类描述符进行反序列化
}
}
return resultClassDescriptor;
}







现在它将我的streamUID转换为LocalUID,但这个例外来找我



`StreamCorruptedException:无效的类型代码:00`

解决方案

Firstly I was getting the Exception - `

    java.io.InvalidClassException local class incompatible: stream classdesc serialVersionUID = 4597316331807173261, local class serialVersionUID = -3344057582987646196`,

 as there is not a `serialVersionUID` in the class COOKIE of the API HtmlUnit that I am using, this exception occurs as the class Cookie is changed because we upgrade the version of `HtmlUnit` , so what idea comes to my mind is to avoid the matching of `serialversionUID` while deserialing, so I have tried the below solution ::

I have overrided readClassDescriptor of ObjectInputStream class in this way 

<pre lang="java">protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
        ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor
        Class localClass = Class.forName(resultClassDescriptor.getName()); // the class in the local JVM that this descriptor represents.
        if (localClass == null) {
            System.out.println("No local class for " + resultClassDescriptor.getName());
            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());
                System.out.println("Potentially Fatal Deserialization Operation. " + e);
                resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization
            }
        }
        return resultClassDescriptor;
    }




and Now it converts my streamUID to LocalUID but this exception comes to me

`StreamCorruptedException: invalid type code: 00`

解决方案

这篇关于在没有serialVersionUID的情况下反序列化对象时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆