1

我有一个使用 JBoss Cache 缓存一些内部对象的应用程序,缓存数据保存在 MySQL 数据库中。当应用程序启动时,持久化在数据库中的数据将被加载到缓存中。Java 序列化机制用于持久化数据。serialVersionUID我为这些持久性 Java 类的字段分配了一个固定值。

问题是当有人对序列化格式引入不兼容的更改时,由于反序列化错误,从数据库加载缓存数据将失败。经过一些研究,我得到了一些可能的解决方案,但不确定哪个是最好的。

  1. 更改serialVersionUID以使用新版本。这种方法似乎很容易。但是我是否需要将所有类的serialVersionUID字段值更改为新版本,或者只是实际更改的类?因为读取的其实是一个对象图,如果不同的类使用不同的序列化版本,反序列化整个对象图会不会有问题?
  2. 使用相同的serialVersionUID值,但创建我自己的readObject和“writeObject”。
  3. 使用Externalizable界面。

哪种方法可能是最好的解决方案?

4

1 回答 1

0

第一个选项对于缓存系统来说已经足够好了,因为不兼容的序列化更改应该是一个罕见的事件,应该被视为缓存未命中。基本上,您需要从缓存中丢弃不兼容的类实例并重新添加新实例。无需更改serialVersionUID兼容类。

如果您想进一步减少可序列化类版本之间不兼容的数量,您可以考虑第二个选项来自定义您的类序列化表单或提供序列化代理。在这里,您应该考虑类的逻辑表示是否比可能序列化不必要的实现细节的默认物理表示更简单。

提供自定义序列化表单可能对缓存系统具有更重要的优势:序列化表单的大小可能会减小,并且序列化过程的速度可能会提高。

另请参阅 Joshua Block 的“Effective Java”,其中有一章很好地讨论了序列化问题。

于 2013-05-27T07:15:01.693 回答