【问题标题】:I did a big mistake using Serializable. How to fix?我在使用 Serializable 时犯了一个大错误。怎么修?
【发布时间】:2015-11-07 17:33:21
【问题描述】:

我在我的 android 应用中实现了 Serializable 对象以保持向后兼容性。

遗憾的是,我这样创建了我的课程:

Class Foo implements Serializable {
   private static long serialVersionUID = 928374172L;
   [...]
}

我痛苦地发现,Java 不会将此值识别为 serialVersionUID,因为缺少“最终”语句。

问题是我无法创建private static final long serialVersionUID,因为已经有一个像这样命名的对象...:/

有没有机会保存这个类,还是我必须创建一个Foo2 类并将所有保存的数据复制到其中?也许有更好的方法?因为我必须在不丢失所有已保存数据的情况下修改此类。

【问题讨论】:

  • 为什么重命名其他变量可行?
  • 除非您修改用于序列化对象的类,否则您不需要 serialVersionUID。您可以简单地对它们进行反序列化。如果您在序列化之后修改类,然后在将对象反序列化到当前版本期间,您将知道该类已更改,则此字段很有用。
  • 您的意思是您需要保持与已在已部署应用的设备上序列化的数据的向后兼容性?
  • @amitmahajan 因为我需要修改类而不丢失所有保存的数据.. :(

标签: java android serializable


【解决方案1】:

您当前的serialVersionUIDstatic,因此它不参与对象的(反)序列化。所以给它添加final是安全的。

如果您的当前值不是默认值,请按照herehere 的说明进行更改。

【讨论】:

  • 但是,这将破坏所有现有的序列化,这些序列化是使用默认值进行的。
  • 我假设 OP 会将值更改为默认值。我知道问题是关于无法再为该类定义serialVersionUID
  • 添加final 是不安全的,除非修复了这个值。假设没有说明。
  • 我只想定义一个serialVersionUID,这样我就可以在反序列化时修改该类而不会出现异常。但是,您的提示奏效了。我刚刚将'private static long serialVersionUID=xy'更改为'private static final long serialVersionUID=xy'。我得到一个异常,由于类不兼容,反序列化失败。在此异常中,打印了当前 versionUID。我用它代替了'xy'并且它起作用了。谢谢! :)
  • Prexx,不客气。 @EJP,感谢您的评论,我通过提供更多详细信息来编辑我的答案。
【解决方案2】:

你需要做两件事。

  1. 在类上运行serialver 工具就像现在一样。这为您提供了在进行现有序列化时假定的值,实际上是整个语句。
  2. 将现有语句替换为工具提供的内容,包括关键字final。这不会破坏任何东西,但是当您对它进行与序列化兼容的更改时,它将保证类在未来不会被破坏,如对象序列化规范的版本控制一章中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2022-10-13
    • 2014-11-14
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多