加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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库的单元测试然后做他们正在做的事情来完成这项工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读