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

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

by
编辑 by
感谢Alex的迅速回复和洞见。
在一个理想的世界里,我们希望能看到(serialVersionUID)被添加到小版本1.11.x中,以便使类兼容。但我们可以通过实现自定义序列化机制并迁移Quartz管理现有数据的方式来解决这个问题。
by
仅供参考,我认为我们将发布1.11.1,并将Keyword和ArraySeq的serialVersionUID回退到1.10.3版本。以防这种情况有助于决定延迟升级路径。
by
听起来很好。我们非常感激这一点,并期待一个新的小版本 :).
Clojure 1.11.1-rc1 现已可用 - 请进行测试并报告结果!
我可能只在slack上进行了回复,但当然这个结果是符合预期的。再次感谢您的迅速修复!
...