【问题标题】:Kryo: Difference between readClassAndObject/ReadObject and WriteClassAndObject/WriteObjectKryo:readClassAndObject/ReadObject 和 WriteClassAndObject/WriteObject 之间的区别
【发布时间】:2018-09-14 19:06:43
【问题描述】:

我试图从文档中理解以下声明:

如果对象的具体类未知且对象可能为空

kryo.writeClassAndObject(输出, 对象);

Object object = kryo.readClassAndObject(input);

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

我有以下代码:

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)

}

当我使用 readClassAndObject 和 writeClassAndObject 时有效。但是,如果我使用 writeObject 和 readObject 则不会。

线程“主”com.esotericsoftware.kryo.KryoException 中的异常: 无法创建类(缺少无参数构造函数): com.romix.scala.serialization.kryo.ScalaProductSerializer

我只是不明白为什么。

之前使用相同的代码,我没有使用我的 RawData 类,而是使用了 Map,它与 writeObject 和 ReadObject 一起工作就像一个魅力。因此我很困惑。

有人可以帮忙理解吗?

【问题讨论】:

    标签: java scala kryo


    【解决方案1】:

    区别如下:

    • 您使用writeClassAndObjectreadClassAndObject 当您使用以下序列化程序时:
      • 序列化一个基类型:一个接口,一个有子类的类,或者——如果是Scala——像Product这样的特征,
      • 并且需要反序列化对象的类型(即Class对象)来构造这个对象(没有这个类型,它不知道要构造什么),
      • 示例:ScalaProductSerializer
    • 当您使用以下序列化程序时,您使用writeObjectreadObject

    总结一下您的具体情况:

    • 当您反序列化您的RawData 时:
      • ScalaProductSerializer 需要找出Product的确切类型以创建实例,
      • 所以它使用typ: Class[Product] 参数来做到这一点,
      • 因此,只有 readClassAndObject 有效。
    • 当您反序列化 Scala 不可变映射时(scala.collection.immutable.Map 导入为 IMap):
      • ScalaImmutableAbstractMapSerializer 不需要找出确切的类型 - 它使用 IMap.empty 创建一个实例,
      • 因此,它不使用typ: Class[IMap[_, _]] 参数,
      • 因此,readObjectreadClassAndObject 都有效。

    【讨论】:

    • 多么好的答案!谢谢你,先生 !!我相信这会对这里的很多人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2015-08-18
    • 2013-01-22
    • 2011-08-20
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多