繁体   English   中英

如何通过gen-class在Clojure中生成可序列化的Java类?

[英]How to generate a serializable java class in Clojure by gen-class?

我们需要通过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在java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579)在java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)在java.io .ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)at java.io.ObjectInputStream.readObject( ObjectInputStream.java:369)

由于serialVersionUID是静态的和final的,但是gen-class似乎只能生成实例级别的final字段。 因此,问题在于我无法为生成的类设置特定的serialVersionUID。

对这个问题有什么建议吗? 提前致谢。

请尝试添加可序列化

(gen-class :name lancelot.Instance :implements [java.io.Serializable] :extends cc.mallet.types.Instance)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM