Clojure によって生成された一連の Java オブジェクトを、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) で java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) で java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) で java.io.ObjectInputStream.readObject( ObjectInputStream.java:369)
serialVersionUID は static で final であるため、gen-class はインスタンス レベルの final フィールドしか生成できないようです。問題は、生成されたクラスに特定の serialVersionUID を設定できないことです。
問題に対するアドバイスはありますか?前もって感謝します。