gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:39:39 26 4
gpt4 key购买 nike

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

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

  1. 更改serialVersionUID以使用新版本。这种方法看起来很简单。但是我是否需要将所有类的 serialVersionUID 字段值更改为新版本,还是仅更改实际更改的类?因为读取的实际上是一个对象图,如果不同的类使用不同的序列化版本,那么反序列化整个对象图时会出现问题吗?
  2. 使用相同的 serialVersionUID 值,但创建我自己的 readObject 和“writeObject”。
  3. 使用Externalized接口(interface)。

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

最佳答案

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

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

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

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

关于java - 使用缓存时管理 Java 对象序列化版本的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com