在没有serialversionuid的情况下反序列化类

时间:2017-02-25 00:45:57

标签: java

我有一个实现可序列化接口的类。我试图反序列化由另一个应用程序序列化和存储的对象。由另一个应用程序存储的对象由类似于下面的类创建 -

// does not have serialversionuid defined.
public Class Pet  implements Serializable {
    private count;       
    private date;

    // getters & setters
}

我的应用程序中定义了类似的类。我也没有定义serialversionuid。当我尝试反序列化此对象时,我看到类似于此的错误 -

  

解组java.io.InvalidClassException时发生IO错误:   本地类不兼容:stream classdesc serialVersionUID =   -3565652537049376317,本地类serialVersionUID = -4242367052120288379

我无法控制序列化和存储数据的类。有没有办法让我对我的类进行更改,以便它可以反序列化对象?

2 个答案:

答案 0 :(得分:4)

根据this规范中的4.6节,如果可序列化类没有指定serialVersionUID,则JVM会根据类详细信息选择一个。然而,它选择的算法(在上面的链接中描述)对类细节高度敏感。此外,它也可能依赖于编译器实现,因为该算法直接用于反映类定义的字节流。

在您的情况下,由于您在解组时遇到无效的类版本错误,这意味着以下两件事之一:

  1. 您的课程虽然您认为与其他应用程序使用的课程非常接近,但仍然略有不同。再次检查算法。它对课程细节非常敏感。
  2. 由其他应用程序序列化的对象是由不同编译器生成的类定义创建的。
  3. 为了能够反序列化该对象,您必须检查上述两种可能性并采取措施消除差异。

答案 1 :(得分:0)

这不是问题。 serialVersionUID不匹配,因为类不同。