package entellect.spike.Kryo
import java.io.{ByteArrayInputStream, ByteArrayOutputStream}
import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.io.{Input, Output}
object KryoSpike extends App {
val kryo = new Kryo()
kryo.addDefaultSerializer(classOf[scala.collection.Map[_,_]], classOf[ScalaMapSerializer])
kryo.addDefaultSerializer(classOf[scala.collection.generic.MapFactory[scala.collection.Map]], classOf[ScalaMapSerializer])
val testin = Map("id" -> "objID", "field1" -> "field1Value")
val outStream = new ByteArrayOutputStream()
val output = new Output(outStream, 4096)
kryo.writeClassAndObject(output, testin)
output.flush()
val input = new Input(new ByteArrayInputStream(outStream.toByteArray), 4096)
val testout = kryo.readObject(input, classOf[Map[String,String]])
println(testout.toString)
}
下面的行不编译,因为编译没有找到“hashmap$hashtriemap”
classOf[ScalaImmutableMapSerializer])
kryo.register(classOf[scala.collection.immutable.HashMap$HashTrieMap],
40)
最后,我的示例如下所示:
object KryoSpike extends App {
val kryo = new Kryo()
kryo.addDefaultSerializer(classOf[scala.collection.Map[_,_]], classOf[ScalaImmutableMapSerializer])
kryo.addDefaultSerializer(classOf[scala.collection.generic.MapFactory[scala.collection.Map]], classOf[ScalaImmutableMapSerializer])
val testin = Map("id" -> "objID", "field1" -> "field1Value")
val outStream = new ByteArrayOutputStream()
val output = new Output(outStream, 4096)
kryo.writeClassAndObject(output, testin)
output.flush()
val input = new Input(new ByteArrayInputStream(outStream.toByteArray), 4096)
val testout = kryo.readObject(input, classOf[Map[String,String]])
println(testout.toString)
}
"org.apache.spark" % "spark-core_2.11" % "2.3.1",
"org.apache.spark" % "spark-sql_2.11" % "2.3.1",
"com.typesafe.akka" %% "akka-stream" % "2.5.16",
"com.typesafe.akka" %% "akka-http-spray-json" % "10.1.4",
"com.typesafe.akka" %% "akka-stream-kafka" % "0.22",
"com.github.romix.akka" %% "akka-kryo-serialization" % "0.5.0"
注我没有使用Kryo特定的Akka特性,我使用它作为一个通用的序列化框架。火花也一样。没有直接插入火花或akka配置。
解决方案使用
带映射的ScalaImmutableAbstractMapSerializer
以及writeObject和readObject方法。
package entellect.spike.Kryo
import java.io.{ByteArrayInputStream, ByteArrayOutputStream}
import com.esotericsoftware.kryo.Kryo
import com.esotericsoftware.kryo.io.{Input, Output}
import com.romix.scala.serialization.kryo._
object KryoSpike extends App {
val kryo = new Kryo()
kryo.setRegistrationRequired(false)
kryo.addDefaultSerializer(classOf[scala.collection.Map[_,_]], classOf[ScalaImmutableAbstractMapSerializer])
kryo.addDefaultSerializer(classOf[scala.collection.generic.MapFactory[scala.collection.Map]], classOf[ScalaImmutableAbstractMapSerializer])
val testin = Map("id" -> "objID", "field1" -> "field1Value")
val outStream = new ByteArrayOutputStream()
val output = new Output(outStream, 4096)
kryo.writeObject(output, testin)
output.flush()
val input = new Input(new ByteArrayInputStream(outStream.toByteArray), 4096)
val testout = kryo.readObject(input, classOf[scala.collection.Map[_,_]])
println(testout.toString)
}
akka-kryo-serialization 提供了基于 Kryo 的序列化器,用于 Scala 和 Akka。可用于更高效的 akka actor 的远程访问。
我在Scala2.11.1和Hzaelcast 3.5中使用kryo进行序列化。我试图将数据放在hazelcast映射中,但我得到了KryoException 下面是我的用户类序列化程序 现在,当我将用户类对象从Hcast客户端放入相应的映射中时,如下所示 它给了我这些例外: 以下是中的 请帮帮我!!
我写了一个Akka基本演员,可以处理一些常见的消息。我想通过扩展基执行元(而不是通过基执行元的组合),在子执行元中重用这个基本行为。 我在前面的问题中看到过几种做法。它们都是有效的,但也可以改进: null 下面是两种可供选择的方法,我可以创建子执行元的实例,它结合了常见行为和附加行为: 最后,我可以通过以下方式调用子参与者: 我的实现存在的问题: 就像我之前说过的,我更喜欢在定义子执行元时混合基
class下导致new HelloWorld行出现错误: 所以我尝试:,但这会导致编译器错误: 下面的HelloWorld应该如何实现? 阅读其他Scala文档时,要求在扩展Actor的类中定义act方法,然后在该类上调用start方法,是否有理由使用actorOf而不是定义act方法? 以下内容摘自Scala akka docs http://doc.akka.io/docs/akka/2.2.
当将akka从1.2升级到akka 2.0.2时,我无法实现camel,因为akka 2.0.2不支持akka-camel,我尝试使用akka 2.1-snapshots,但它需要scala 2.10,我如何用scala 2.9.x运行akka 2.1-snapshots? 当我编译testkit时,总是会出现以下错误: 加载包时出错,包所需的类文件丢失。[错误]对象的引用值$Default$2引