使用缓存时管理Java对象序列化版本的策略

时间:2013-05-27 01:52:01

标签: java caching serialization jboss

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

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

  1. 更改serialVersionUID以使用新版本。这种方法似乎很容易。但是,我是否需要将所有类的serialVersionUID字段值更改为新版本,或仅更改实际更改的类?因为读取的内容实际上是一个对象图,如果对不同的类使用不同的序列化版本,那么在反序列化整个对象图时会出现问题吗?
  2. 使用相同的serialVersionUID值,但创建我自己的readObject和'writeObject`。
  3. 使用Externalizable界面。
  4. 哪种方法可能是最佳解决方案?

1 个答案:

答案 0 :(得分:0)

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

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

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

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