Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kryo:readClassAndObject/ReadObject和WriteClassAndObject/WriteObject之间的区别_Java_Scala_Kryo - Fatal编程技术网

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

Java Kryo:readClassAndObject/ReadObject和WriteClassAndObject/WriteObject之间的区别,java,scala,kryo,Java,Scala,Kryo,我试图从文件中理解以下陈述: 如果对象的具体类未知且对象可能为空: kryo.writeClassAndObjectoutput,对象 Object Object=kryo.readClassAndObjectinput 如果不确切知道具体类,该怎么办 我有以下代码: case class RawData(modelName: String, sourceType: String, deNormalizedVal: St

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

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

kryo.writeClassAndObjectoutput,对象

Object Object=kryo.readClassAndObjectinput

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

我有以下代码:

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时,它是works。但是,如果我使用writeObject和readObject,则不会

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

我只是不明白为什么

之前使用相同的代码,而不是使用我的类RawData,我使用了一个Map,它与writeObject和ReadObject一起工作,就像一个符咒。因此,我感到困惑


有人能帮助理解吗?

区别如下:

在使用序列化程序时,可以使用writeClassAndObject和readClassAndObject: 序列化一个基类型:一个接口,一个有子类的类,或者-在Scala的情况下-一个类似于, 并且需要类型,即反序列化对象的类对象来构造此对象,如果没有此类型,它不知道要构造什么, 例子: 使用序列化程序时,可以使用writeObject和readObject,该序列化程序: 仅序列化一种类型,即可以实例化的类;示例:, 或序列化多个类型,但可以通过序列化数据示例推断特定类型: 为了总结您的具体案例,请执行以下操作:

反序列化原始数据时: 需要找出创建实例的确切产品类型, 因此,它使用typ:Class[Product]参数来执行此操作, 因此,只有readClassAndObject可以工作。 反序列化作为IMap导入的Scala不可变映射时: 不需要找出确切的类型-它使用IMap.empty创建实例, 因此,它不使用typ:Class[IMap[\uz,\uz]]参数, 因此,readObject和readClassAndObject都可以工作。
多好的回答!!谢谢你,先生!!我相信这会帮助很多弗洛克人。