Как создать сериализуемый Java-класс в Clojure по gen-классу?

Нам нужно сериализовать группу объектов 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; несовместимый локальный класс: stream classdesc serialVersionUID = 2583852145887230781, локальный класс serialVersionUID = -2255006751011717591 в java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:579) в java.io.Oread.jpg.jpg.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) в java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) в java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1jectioOj.read.jectbject.java:1jectioOj.ject.jectbject.java:1jectioOj.java:1bject.jjectbject.java:1jectioO.java:1bject.Oj.Oj.Ob.jpg) ObjectInputStream.java:369)

Поскольку serialVersionUID является статическим и окончательным, но кажется, что gen-class может генерировать только конечное поле уровня экземпляра. Так что проблема в том, что я не могу установить конкретный serialVersionUID для сгенерированного класса.

Любой совет по проблеме? Заранее спасибо.

1 ответ

Пожалуйста, попробуйте добавить Serializable

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

Другие вопросы по тегам