有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

没有SerialVersionId的java反序列化类

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

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

    // getters & setters
}

我在应用程序中定义了一个类似的类。我的也没有定义SerialVersionId。当我尝试反序列化这个对象时,我看到一个类似的错误-

IO error occurred while unmarshalling java.io.InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -3565652537049376317, local class serialVersionUID = -4242367052120288379

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


共 (2) 个答案

  1. # 1 楼答案

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

    在您的情况下,由于在解marshalling期间出现无效类版本错误,这意味着以下两件事之一:

    1. 虽然您认为您的类与另一个应用程序使用的类非常接近,但仍然略有不同。再次检查算法。它对课堂细节非常敏感
    2. 由另一个应用程序序列化的对象是从另一个编译器生成的类定义创建的

    为了能够反序列化该对象,必须检查上述两种可能性,并采取措施消除差异

  2. # 2 楼答案

    这不是问题所在。SerialVersionId不匹配,因为类不同