繁体   English   中英

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

[英]Kryo: Difference between readClassAndObject/ReadObject and WriteClassAndObject/WriteObject

我试图从文档中理解以下语句:

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

kryo.writeClassAndObject(output, 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 它不会。

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

我只是不明白为什么。

早些时候使用相同的代码,而不是使用我的类 RawData,我使用了一个 Map,它与 writeObject 和 ReadObject 一起工作就像一个魅力。 因此我很困惑。

有人可以帮助理解吗?

区别如下:

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

总结一下您的具体情况:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM