2013-05-10 2 views
8

어떻게 불변의 컬렉션을 deserialize합니까 Kryo? 내가 한 일 이외에 뭔가를 등록해야합니까? 여기 Kryo를 사용하여 불변의 컬렉션을 어떻게 직렬화합니까?

그것은 나를 위해 일한으로이 밖으로 시도 예외를

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

답변

4

을 던져 내 샘플 코드

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() 

입니다 : AS를

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() 

을 참고로, 나는이 작업을 얻었다 romix 라이브러리에 대한 단위 테스트를보고 그들이하고 있었던 일을 수행함으로써.

+0

'StdInstantiatorStrategy'가 키입니다. 나는 나머지 부분을 제거했고 너무 효과가 있었다. 감사! – expert

+1

당신의 예제가 나를 위해 컴파일되지 않습니다 :(이 줄의 문제 : kryo.setInstantiatorStrategy (..) 및 kryo.addDefaultSerializer (..) – Adrian

관련 문제