2024年Clojure状况调查!中分享您的想法。

欢迎!请查阅关于页面以了解更多关于如何使用本站的信息。

+1 投票
Clojure
关闭

我最近将我们的应用程序从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最近已被更改更新
因为它没有声明自己的serialVersionUID,因此它获得了一个新的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的serialVersionUID固定在1.10.3版本。如果这能帮助决定延迟升级路径。
听起来太棒了。我们非常感激,并期待新的小版本发布:)。
by
Clojure 1.11.1-rc1现已发布 - 请测试并反馈!
by
我可能在Slack上进行了回复,但当然这是按预期工作的。再次感谢快速的修复!
...