2

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 を設定できないことです。

問題に対するアドバイスはありますか?前もって感謝します。

4

1 に答える 1

1

Serializable を追加してみてください

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

于 2018-05-17T20:48:59.557 に答える