【问题标题】:Deserialize classes without serialversionuid反序列化没有 serialversionuid 的类
【发布时间】:2017-07-15 23:48:08
【问题描述】:

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

// 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

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

【问题讨论】:

  • 我相信类可能会有所不同,您是否可以准确查看正在使用的类是否具有相同的结构?
  • 谢谢@EduardoDennis。你是对的。还有 2 种其他方法。

标签: java


【解决方案1】:

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

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

  1. 尽管您认为您的类与其他应用程序使用的类非常接近,但仍然略有不同。再次检查算法。它对课程细节高度敏感。
  2. 其他应用程序序列化的对象是根据不同编译器生成的类定义创建的。

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

【讨论】:

  • 感谢@VHS。我看到我的班级有 2 个额外的方法。
【解决方案2】:

这不是问题。由于类不同,serialVersionUID 不匹配。

【讨论】:

  • 感谢@Eduardo Dennis
  • 问题,而serialVersionUID的不同之处在于它是如何被检测到的。
  • @EJP 原始帖子他认为问题在于他没有定义串行版本,所以这就是它们不同的原因。请注意第一条评论他是如何理解我在说什么并在 cmets 中感谢我的。
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2013-05-30
  • 1970-01-01
  • 2017-07-29
  • 2014-11-11
相关资源
最近更新 更多