2013-05-10 19 views
8

Jak deserializować niezmienny zbiór przy użyciu Kryo? Czy muszę zarejestrować coś oprócz tego, co zrobiłem?Jak deserializować niezmienną kolekcję za pomocą Kryo?

Oto mój przykładowy kod

import com.esotericsoftware.kryo.Kryo 
import com.esotericsoftware.kryo.io.Input 
import com.esotericsoftware.kryo.io.Output 
import com.romix.scala.serialization.kryo._ 

val kryo = new Kryo 

// Serialization of Scala maps like Trees, etc 
kryo.addDefaultSerializer(classOf[scala.collection.Map[_,_]], classOf[ScalaMapSerializer]) 
kryo.addDefaultSerializer(classOf[scala.collection.generic.MapFactory[scala.collection.Map]], classOf[ScalaMapSerializer]) 

// Serialization of Scala sets 
kryo.addDefaultSerializer(classOf[scala.collection.Set[_]], classOf[ScalaSetSerializer]) 
kryo.addDefaultSerializer(classOf[scala.collection.generic.SetFactory[scala.collection.Set]], classOf[ScalaSetSerializer]) 

// Serialization of all Traversable Scala collections like Lists, Vectors, etc 
kryo.addDefaultSerializer(classOf[scala.collection.Traversable[_]], classOf[ScalaCollectionSerializer]) 

val filename = "c:\\aaa.bin" 
val ofile = new FileOutputStream(filename) 
val output2 = new BufferedOutputStream(ofile) 
val output = new Output(output2) 
kryo.writeClassAndObject(output, List("Test1", "Test2")) 
output.close() 

val ifile = new FileInputStream(filename) 
val input = new Input(new BufferedInputStream(ifile)) 
val deserialized = kryo.readClassAndObject(input) 
input.close() 

To rzuca wyjątek

Exception in thread "main" com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): scala.collection.immutable.$colon$colon 

Odpowiedz

4

Spróbuj tego jak to działa dla mnie:

import com.esotericsoftware.kryo.Kryo 
import com.esotericsoftware.kryo.io.Input 
import com.esotericsoftware.kryo.io.Output 
import com.romix.scala.serialization.kryo._ 
import org.objenesis.strategy.StdInstantiatorStrategy 

val kryo = new Kryo 

kryo.setRegistrationRequired(false) 
kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); 
kryo.register(classOf[scala.collection.immutable.$colon$colon[_]],60) 
kryo.register(classOf[scala.collection.immutable.Nil$],61) 
kryo.addDefaultSerializer(classOf[scala.Enumeration#Value], classOf[EnumerationSerializer]) 

val filename = "c:\\aaa.bin" 
val ofile = new FileOutputStream(filename) 
val output2 = new BufferedOutputStream(ofile) 
val output = new Output(output2) 
kryo.writeClassAndObject(output, List("Test1", "Test2")) 
output.close() 

val ifile = new FileInputStream(filename) 
val input = new Input(new BufferedInputStream(ifile)) 
val deserialized = kryo.readClassAndObject(input) 
input.close() 

Jako FYI, mam tej pracy patrząc na testy jednostkowe dla biblioteki romix, a następnie robiąc to, co robili.

+0

Wygląda na to, że kluczem jest 'StdInstantiatorStrategy'. Usunąłem resztę i to też zadziałało. Dzięki! – expert

+1

Twój przykład nie kompiluje się dla mnie :(Problemy na tych liniach: kryo.setInstantiatorStrategy (..) i kryo.addDefaultSerializer (..) – Adrian

Powiązane problemy