我们需要通过 Java 序列化机制将 Clojure 生成的一堆 Java 对象序列化成一个文件。
(gen-class
:name lancelot.Instance
:extends cc.mallet.types.Instance)
(gen-class
:name lancelot.FilterPipe
:extends cc.mallet.pipe.Pipe
:prefix "-filter-"
:methods [[pipe [cc.mallet.types.Instance] lancelot.Instance]])
(defn -filter-pipe [this ^cc.mallet.types.Instance inst]
(.setData inst (clojure.string/join " "
(filter normal-word? (clojure.string/split (.getData inst) #"\s+"))))
inst)
(gen-class
:name lancelot.SegmentorPipe
:extends cc.mallet.pipe.Pipe
:prefix "-segmentor-"
:methods [[pipe [cc.mallet.types.Instance] lancelot.Instance]])
(defn -segmentor-pipe [this ^cc.mallet.types.Instance inst]
(.setData inst (seg/seg (.getData inst)))
inst)
如上,lancelot.FilterPipe 和 lancelot.SegmentorPipe 的实例需要序列化。我们发现写对象流是可以的,但是重新编译代码后读取对象流就不行了。
线程“Thread-8”中的异常 java.io.InvalidClassException: lancelot.SegmentorPipe; 本地类不兼容:流 classdesc serialVersionUID = 2583852145887230781,本地类 serialVersionUID = -2255006751011717591 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601) at java.io .ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 在 java.io.ObjectInputStream.readObject(对象输入流.java:369)
由于serialVersionUID 是静态的和最终的,但似乎gen-class 只能生成实例级别的最终字段。所以问题是我无法为生成的类设置特定的serialVersionUID。
对这个问题有什么建议吗?提前致谢。