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。这肯定是一个疏忽。我找到了一个旧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 上只回复了,但这当然符合预期。再次感谢快速修复!
...