代码之家  ›  专栏  ›  技术社区  ›  MaatDeamon

Kryo:readClassAndObject/ReadObject和WriteClassAndObject/WriteObject的区别

  •  1
  • MaatDeamon  · 技术社区  · 6 年前

    我试图从文件中理解以下陈述:

    如果对象的具体类未知,则该对象可能为空 :

    kryo.writeClassAndObject文件(输出,对象);

    如果具体的类不确切地知道怎么办。

    我有以下代码:

    case class RawData(modelName: String,
                       sourceType: String,
                       deNormalizedVal: String,
                       normalVal: Map[String, String])
    
    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])
      kryo.addDefaultSerializer(classOf[RawData], classOf[ScalaProductSerializer])
    
      //val testin = Map("id" -> "objID", "field1" -> "field1Value")
      val testin = RawData("model1", "Json", "", Map("field1" -> "value1", "field2" -> "value2") )
    
      val outStream = new ByteArrayOutputStream()
      val output = new Output(outStream, 20480)
      kryo.writeClassAndObject(output, testin)
      output.close()
    
    
      val input = new Input(new ByteArrayInputStream(outStream.toByteArray), 4096)
      val testout = kryo.readClassAndObject(input)
      input.close()
      println(testout.toString)
    
    }
    

    线程“main”中出现异常com.esotericsoftware.kryo公司.kryo异常: 无法创建类(不缺少参数构造函数): com.romix.scala公司.serialization.kryo.ScalaProductSerializer

    以前使用相同的代码,而不是使用我的类RawData,我使用了一个Map,它在writeObject和ReadObject中工作得非常出色。所以我很困惑。

    有人能帮忙理解吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Tomasz Linkowski    6 年前

    • 你用 writeClassAndObject readClassAndObject 使用序列化程序时:
      • 序列化 基本类型 :一个接口,一个有子类的类,或者-在Scala的情况下-一个类似于 Product ,
      • 需要类型(即 Class 对象)来构造此对象(没有此类型,它不知道 什么 建造),
      • ScalaProductSerializer
    • 你用 writeObject readObject 使用序列化程序时:

    总结一下您的具体案例:

    • RawData :
      • 需要 为了找出 产品 要创建实例,
      • 所以它使用 typ: Class[Product] 参数来做这件事,
      • 因此,只有 读取类和对象 作品。
    • scala.collection.immutable.Map 导入为 IMap ):