scala – 如何使用Kryo反序列化不可变集合?
发布时间:2020-12-16 08:57:23 所属栏目:安全 来源:网络整理
导读:如何使用 Kryo反序列化不可变集合?除了我做的事情之外,我还需要注册一些东西吗? 这是我的示例代码 import com.esotericsoftware.kryo.Kryoimport com.esotericsoftware.kryo.io.Inputimport com.esotericsoftware.kryo.io.Outputimport com.romix.scala.se
如何使用
Kryo反序列化不可变集合?除了我做的事情之外,我还需要注册一些东西吗?
这是我的示例代码 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() 它抛出异常 Exception in thread "main" com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): scala.collection.immutable.$colon$colon 解决方法
尝试这个,因为它对我有用:
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,"Test2")) output.close() val ifile = new FileInputStream(filename) val input = new Input(new BufferedInputStream(ifile)) val deserialized = kryo.readClassAndObject(input) input.close() 作为一个FYI,我通过查看romix库的单元测试然后做他们正在做的事情来完成这项工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |