当前位置: 首页 > 知识库问答 >
问题:

如何在akka-kryo-serializer中使用Scala映射

冀翰翮
2023-03-14
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配置。

共有1个答案

常飞翼
2023-03-14

解决方案使用

带映射的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引