请在2024 Clojure 状态调查!分享您的想法。

欢迎!有关如何使用本站的一些更多信息,请参阅关于页面

+1

我最近将我们的应用程序从Clojure 1.10.3升级到1.11.0,现在我们通过Quartz(定时任务)读取旧版本序列化的对象时遇到了反序列化问题。

这是我们所遇到的问题

....
org.quartz.impl.StdScheduler.getJobDetail StdScheduler.java: 498
org.quartz.core.QuartzScheduler.getJobDetail QuartzScheduler.java: 1518
org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob JobStoreSupport.java: 1374
org.quartz.impl.jdbcjobstore.JobStoreSupport.executeWithoutLock JobStoreSupport.java: 3739
org.quartz.impl.jdbcjobstore.JobStoreTX.executeInLock JobStoreTX.java: 93
org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock JobStoreSupport.java: 3803
org.quartz.impl.jdbcjobstore.JobStoreSupport$9.execute JobStoreSupport.java: 1377
org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob JobStoreSupport.java: 1385
org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail StdJDBCDelegate.java: 860
org.quartz.impl.jdbcjobstore.StdJDBCDelegate.getObjectFromBlob StdJDBCDelegate.java: 3201
java.io.ObjectInputStream.readObject ObjectInputStream.java: 460
...
java.io.ObjectStreamClass.initNonProxy ObjectStreamClass.java: 699
java.io.InvalidClassException: clojure.lang.Keyword; local class incompatible: stream classdesc serialVersionUID = -2105088845257724163, local class serialVersionUID = 2404715664513862299
org.quartz.JobPersistenceException: Couldn't retrieve job because the BLOB couldn't be deserialized: clojure.lang.Keyword; local class incompatible: stream classdesc serialVersionUID = -2105088845257724163, local class serialVersionUID = 2404715664513862299

我很好奇,这个问题是否是因为Keyword.java最近进行了更改[a rel="nofollow" href="https://github.com/clojure/clojure/commit/bd4c42dc7946cb015b8d0699596662aa68bcdc89" target="_blank">在这里
并且因为它没有声明自己的 serialVersionUID ,因此它获得了一个新的。
Keyword类不声明自己的serialVersionUID有什么原因?我们可以修复它吗?

以如下注释关闭: 在1.11.1中修复

1 答案

+1

被选中
 
最佳答案

是的,这就是错误的原因。回顾以往,我认为这些类十年前在实现序列化时就应设置 serialVersionUID。这肯定是疏忽了。我确实找到了一个旧的 jira https://clojure.atlassian.net/browse/CLJ-1327,过去我从未遇到过它。

我们从未保证 Clojure 类的 Java 序列化跨版本稳定性,但遗憾的是,这次更改无意中造成了不同的序列化版本。

我们目前正在评估此问题的范围并决定如何处理。


编辑
感谢 Alex 的快速响应和见解。
在理想的世界里,我们希望能够看到在次要的 1.11.x 发行版中添加 serialVersionUID 以使类兼容,但我们可以通过实现自定义序列化机制并迁移由 Quartz 管理的现有数据来解决这个问题。
供您参考,我估计我们将发布 1.11.1,并将 Keyword 和 ArraySeq 的 serialVersionUIDs 锁定回 1.10.3 版本。以防这有助于决定延迟升级路径。
听起来不错。我们非常感激,并期待下一个小的版本更新 :).
Clojure 1.11.1-rc1 已发布 - 请进行测试并反馈!
我可能只在 Slack 上回复了,但当然这正常工作。再次感谢迅速的修复!
...