请在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它得到了一个新的。
Keyword类为什么没有声明自己的serialVersionUID?我们能解决这个问题吗?

备注:已解决 在1.11.1中修复

1 答案

+1

最佳答案
 
最佳答案

是的,这就是错误的原因。回顾过去,我认为那些类在十年前被做成可序列化时,都应该设置了 serialVersionUID。这当然是个疏忽。我确实找到了一个旧的 jirahttps://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上回复了,但当然这是按预期工作的。再次感谢迅速的修复!
...