2016-09-11 2 views
-1

Ich habe eine Klasse mit einem Feld von scala.collection.mutable.LongMap Typ.Deserializing LongMap in Kryo

Nachdem es mit Kryo Serialisierung ich versuchen, das Objekt deserialisieren und die folgende Ausnahme erhalten:

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 die LongMap als HashMap serialisiert und dann versagt Deserialisierung als die HashMap kann nicht auf die LongMap geschrieben werden Feld.

Ich manuell etwas wie https://github.com/romix/akka-kryo-serialization/blob/master/src/test/scala/com/romix/scala/serialization/kryo/MapSerializerTest.scala#L78 ausgeführt und bestätigt, dass serialisiert LongMap in HashMap deserialized ist.

Jede Idee, wie man richtig lesen/schreibt dieses Objekt so wird die LongMap als LongMapHashMap statt gelesen werden?

Muss ich eine Proxy-Klasse verwenden? einen benutzerdefinierten Serializer/Deserializer schreiben? Gibt es alternativ eine anständige Serialisierungsbibliothek, die LongMap s richtig behandelt?

P.S. Ich hätte die Frage mit LongMap markiert, aber ich habe nicht genug Ruf, um neue Tags zu erstellen.

+0

zeigen Sie Ihre Klassendefinition ... –

Antwort

0

Ja, Sie müssen einen benutzerdefinierten Serializer hinzufügen. Es gibt https://github.com/twitter/chill#serializers-for-scala-classes, die Serialisierer für einige Typen in Scala-Standardbibliothek enthält, aber anscheinend nicht für LongMap (möglicherweise verwenden Sie diese Bibliothek bereits, vielleicht indirekt). Schau dir an, wie sie es machen und schreibe dein eigenes.

Dieser Fehler sollte jedoch standardmäßig nicht auftreten. Suchen Sie nach Kryo#register und Kryo#setDefaultSerializer Anrufe in Ihrem Code (oder Code, den Sie anrufen): Sagen Sie Kryo Serialisierung/Deserialisierung aller scala.collection.mutable.Map s als HashMap s?

+0

Danke, einen benutzerdefinierten Serializer für LongMap schreiben, löste es. Ich habe 'Kryo # register' und' Kryo # setDefaultSerializer' nicht explizit genannt und Kryo nicht angewiesen, 'Map's als' HashMap' zu serialisieren/deserialisieren. Ich nehme an, das ist das Standardverhalten. – lalaland