2016-09-11 5 views
-1

私はscala.collection.mutable.LongMapタイプのクラスを持っています。KryoでLongMapを逆シリアル化する

Kryoでそれをシリアル化した後、私は、オブジェクトをデシリアライズし、次の例外を取得しようとすると:

com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Can not set final scala.collection.mutable.LongMap field com.name.of.field to scala.collection.mutable.HashMap 
Serialization trace: 
field (com.name.of) 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:626) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:648) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.read(FieldSerializer.java:605) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 
    at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:221) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 
    at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:729) ~[com.esotericsoftware.kryo.kryo-2.21.jar:na] 

IIUC LongMapHashMapとしてシリアル化され、HashMapLongMapに書き込むことができないとして、その後のデシリアライズに失敗しましたフィールド。

手動でhttps://github.com/romix/akka-kryo-serialization/blob/master/src/test/scala/com/romix/scala/serialization/kryo/MapSerializerTest.scala#L78のようなものを実行し、シリアライズされたLongMapがデシリアライズされてHashMapになることを確認しました。

LongMapHashMapの代わりにLongMapと読み込まれるように、このオブジェクトを正しく読み書きする方法はありますか?

プロキシクラスを使用する必要がありますか?カスタムシリアライザ/デシリアライザを作成しますか? また、LongMapを適切に処理する適切なシリアライゼーションライブラリがありますか?

P.S.私はLongMapと質問をタグ付けしたが、私は新しいタグを作成するための十分な評判を持っていない。

+0

あなたのクラス定義を表示... –

答えて

0

はい、カスタムシリアライザを追加する必要があります。 https://github.com/twitter/chill#serializers-for-scala-classesには、Scala標準ライブラリの一部のタイプのシリアライザが含まれていますが、明らかにLongMap(おそらくこのライブラリを既に間接的に使用している可能性があります)ではありません。彼らがそれをやり遂げる方法を見て、自分のことを書いてください。

ただし、このエラーはデフォルトでは発生しません。あなたのコード(またはあなたが呼んでいるコード)でKryo#registerKryo#setDefaultSerializerの呼び出しを探します:scala.collection.mutable.Mapをすべてシリアル化/逆シリアル化するようにKryoに伝えていますか?HashMap

+0

ありがとう、それを解決したLongMapのカスタムシリアライザを書いてください。 私は 'Kryo#register'や' Kryo#setDefaultSerializer'を明示的に呼ばず、Kryoに 'Map'sを' HashMap'として直列化/逆シリアル化するよう指示しませんでした。私はそれがデフォルトの動作だと考えます。 – lalaland

関連する問題