【问题标题】:Java Deserialization of java.lang.Integer - Exceptionjava.lang.Integer 的 Java 反序列化 - 异常
【发布时间】:2010-10-25 11:43:32
【问题描述】:

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

java.io.InvalidClassException: java.lang.Integer;本地类不兼容:stream classdesc serialVersionUID = 1360826667802527544,本地类serialVersionUID = 1360826667806852920

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

【问题讨论】:

  • 能否请您发布序列化和反序列化代码?

标签: java serialization integer


【解决方案1】:

通过查看 JDK 源代码,1360826667806852920 是正确的 serialVersionUIDInteger。我无法使用serialVersionUID 1360826667802527544 在 JDK 中找到任何类。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      所以我想说问题出在你的一类你在序列化和反序列化之间改变并且没有特定的serialVersionUID......

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

      【讨论】:

      • 这很奇怪,因为序列化整数中的第一组数字是相同的(136082666780...) - 这表明序列化文件或输入流(?)
      • OpenJDK 7 (hg.openjdk.java.net/icedtea/jdk7/jdk/file/65dfd94650d3/src/…) 仍然使用这个 ID,这也是标识为“本地类”的 ID。所以不知何故,看起来你正在反序列化一个非标准/不兼容的整数。
      • 你是对的,目前没有答案,但如果你用谷歌搜索 'serialVersionUID = 1360826667802527544' 你会发现他并不孤单 :)
      • 哈托有道理。这可能只是老式的文件损坏。
      【解决方案4】:

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

              /** 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()); 
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        • 2019-08-22
        • 2016-10-08
        • 2021-08-15
        相关资源
        最近更新 更多