繁体   English   中英

java.lang.Integer 的 Java 反序列化 - 异常

[英]Java Deserialization of java.lang.Integer - Exception

反序列化HashMap<String, Integer>时收到以下异常:

java.io.InvalidClassException: java.lang.Integer; local class incompatible: stream classdesc serialVersionUID = 1360826667802527544, local class serialVersionUID = 1360826667806852920

在同一台机器上使用相同的 JRE 进行序列化和反序列化。 JDK 1.6.0_12

从 JDK 源代码来看, 1360826667806852920 是Integer的正确serialVersionUID 我无法在 JDK 中使用serialVersionUID 1360826667802527544 找到任何类。

有趣的是,在 Google 上搜索 1360826667802527544 时发现了一些其他人遇到了这个问题,尤其是 Sun 论坛上的这个帖子。 那里的问题是这个人将字节存储在一个字符串中,并且序列化的数据被破坏了。 由于您获得了相同的serialVersionUID ,您似乎很可能遇到了类似的问题。

永远不要将字节存储在String中。 使用字节数组或设计用于保存字节而不是字符的类。

我遇到了同样的问题,这是因为当我们尝试将 Integer 对象存储到 String 时,字符编码变得混乱,并且在反序列化时 serialVersionUID 读取是错误的。 这就是这个错误的根本原因。 为避免此错误,请在将其存储到 String 之前使用Base64编码 看到这个答案,问题就为我解决了。

        /** Read the object from Base64 string. */
   private static Object fromString( String str ) throws IOException, ClassNotFoundException {
        byte [] data = Base64.getDecoder().decode(str);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
        Object o = ois.readObject();
        ois.close();
        return o;
   }

    /** Write the object to a Base64 string. */
    private static String toString( Serializable o ) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream( baos );
        oos.writeObject( o );
        oos.close();
        return Base64.getEncoder().encodeToString(baos.toByteArray()); 
    }

检查 Integer 的源代码,这是我在几个 java 版本中对 Integer 的代码:

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1360826667806852920L;

所以我会说问题来自你的一类,你在序列化和反序列化之间进行了更改,并且没有特定的serialVersionUID ...

也许你应该看看这个,同样的问题描述,它看起来像错误的序列化/反序列化代码......

那不应该发生。 请注意,ID 仅在最后几位数字上有所不同; 第二个是我在我的 JDK 源代码中看到的那个。

我的猜测是序列化流以某种方式损坏了。

我在编译的 jasperreport 上遇到了同样的问题。 由于 ant build 的过滤,服务器上的 pack ear 已损坏。 结果,原始的jasperreport文件与耳朵上的那个有一些差异。

我已修改 ant 构建以仅复制文件(而不是过滤)而不过滤

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM