2013-05-10 45 views
8

Làm thế nào để bạn deserialize bộ sưu tập bất biến bằng cách sử dụng Kryo? Tôi có cần phải đăng ký một cái gì đó ngoài những gì tôi đã làm không?Làm thế nào để bạn deserialize bộ sưu tập bất biến bằng cách sử dụng Kryo?

Đây là mẫu của tôi đang

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

Nó ném ngoại lệ

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

Trả lời

4

Hãy thử điều này vì nó làm việc cho tôi:

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

Là một FYI, tôi đã làm việc này bằng cách xem xét các bài kiểm tra đơn vị cho thư viện romix và sau đó thực hiện những gì họ đang làm.

+0

Có vẻ như 'StdInstantiatorStrategy' là chìa khóa. Tôi đã gỡ bỏ phần còn lại và nó cũng hoạt động. Cảm ơn! – expert

+1

ví dụ của bạn không biên dịch cho tôi: (Các vấn đề trên các dòng này: kryo.setInstantiatorStrategy (..) và kryo.addDefaultSerializer (..) – Adrian

Các vấn đề liên quan