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

使用Scala使用Kryo的HazelcastSerializationException

路阳华
2023-03-14

我在Scala2.11.1和Hzaelcast 3.5中使用kryo进行序列化。我试图将数据放在hazelcast映射中,但我得到了KryoException

  @SerialVersionUID(1)
        case class User( id : Int ,name : String, userType : UserType /*UserType is Enum (EMPLOYED , UNEMPLOYED)*/ , userhistory : UserHistory) extends  Serializable{

def this()= {
this(0,"",Active, null)
}
}
    @SerialVersionUID(1)
case  class UserHistory( date : DateTime = DateTime.now(), artworkStatus : ArtworkStatus = ACTIVE) extends  Serializable{

def this()={
    this(DateTime.parse("0"),ACTIVE) 
  }
}

下面是我的用户类序列化程序

class UserSerializer extends StreamSerializer[User] {


   val log = LoggerFactory.getLogger(this.getClass)

   override def destroy() {

  }

  override def getTypeId() : Int ={
    val value : Int = 1;
    value

  }

  // takes the bytes and converts into User Object
   @throws(classOf[IOException])
  override def read(in : ObjectDataInput) : User =  {

     val kryo = new Kryo 
     val input = new Input(in.asInstanceOf[InputStream])
      log.info("********** Reading the bytes and converting into User object")
     kryo.readClassAndObject(input).asInstanceOf[User]



  }

   // takes User Object and converts into bytes
  @throws(classOf[IOException])
  override def write(out : ObjectDataOutput, obj : User) {

    val kryo= new Kryo
    val bops = new ByteArrayOutputStream
    val output = new Output(bops)
    kryo.writeClassAndObject(output , obj)
    output.flush
    output.close

    bops.writeTo(out.asInstanceOf[OutputStream])

    log.info("********** User object writen into bytes successfully")


  }


}

现在,当我将用户类对象从Hcast客户端放入相应的映射中时,如下所示

map.set(user.id , user)

它给了我这些例外:

 Cannot invoke the action, eventually got an error: com.hazelcast.nio.serialization.HazelcastSerializationException: com.esotericsoftware.kryo.KryoException: Class cannot be created (non-static member class): scala.Enumeration$Val

以下是HCAST Server中的StackTraces

请帮帮我!!

共有1个答案

宰父宾实
2023-03-14

通常对于Scala,您应该使用StdinStantiatorStrategy,例如。

val kryo = new Kryo
val is = new org.objenesis.strategy.StdInstantiatorStrategy
kryo.setInstantiatorStrategy(instantiatorStrategy)

不确定这是否会解决你的问题,但我没有看到任何这样的问题。

 类似资料:
  • 下面的行不编译,因为编译没有找到“hashmap$hashtriemap” 40) 最后,我的示例如下所示: 注我没有使用Kryo特定的Akka特性,我使用它作为一个通用的序列化框架。火花也一样。没有直接插入火花或akka配置。

  • 我看到了很多关于Kryo是否可以用来替换RMI所使用的默认JVM序列化的问题,但没有关于如何实际设置它的问题。我听说Kryo是JVM序列化的“插入式”替换,不确定这是否意味着您可以从运行时类路径中交换一些JAR(就像SLF4J绑定等的情况一样),或者其他东西。 所以我要问:如何使用Kryo而不是Java附带的默认JVM序列化来获得RMI?提前道谢!

  • 我正在尝试运行一个用scala编写的mapreduce程序。我已经在类路径中包含了scala库。运行程序时,我的程序抛出以下错误。 $hadoop jar~/HadoopScala。jar com。学习火花字数/输入/字数输入。csv/output-libjars ~/lib/org。scala-lang.scala-library\u 2.12.2。v20170412-161608-VFINAL

  • 从SBT到Scala-IDE的路径在很多地方都有很好的描述: 从SBT项目开始 添加SBT插件定义:addSbtPlugin(“com.typesafe.sbteclipse”%“sbteclipse-plugin”%“2.1.0-rc1”) 从SBT内运行'eclipse'命令 使用已安装的Scala-IDE加载项打开Eclipse 导入项目 什么是反向的?如果我在Scala-IDE中启动了一个

  • 本文向大家介绍Kryo框架使用方法代码示例,包括了Kryo框架使用方法代码示例的使用技巧和注意事项,需要的朋友参考一下 Kryo框架的source已移至https://github.com/EsotericSoftware/kryo ,进入此页面,然后点击右边的Download Zip按钮,就能下载到最新版本的Kryo框架。      导入Eclipse时,记得JDK/JRE选用 JDK1.7版本