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序列化能够在发布之间保持稳定,但遗憾的是,这个更改无意中导致了不同的序列化版本。

我们目前正在评估这个问题的影响范围,并决定如何处理。

by
编辑了 by
感谢Alex的迅速回应和见解。
在一个理想的世界里,我们希望看到在1.11.x小版本发布中对serialVersionUID进行添加以使类兼容,但我们可以通过实现自定义序列化机制并迁移Quartz管理的数据来找到解决问题的方法。
by
顺便提一下,我想我们将会发布1.11.1版本,并将Keyword和ArraySeq的serialVersionUIDs归回1.10.3版本。如果这有助于决定延期升级路径的话。
by
听起来很棒。我们非常感激这一点,正在等待新的小版本发布 :).
by
Clojure 1.11.1-rc1 现已可用 - 请进行测试并反馈!
by
我可能只在 Slack 上回复了,但当然这按预期工作。再次感谢快速修复!
...