斯卡拉 - InvalidClassException:没有有效的构造 [英] Scala - InvalidClassException: no valid constructor

查看:1865
本文介绍了斯卡拉 - InvalidClassException:没有有效的构造的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个序列化版本番石榴的 ImmutableRangeMap 生成器在Scala中,以在我的星火应用程序中使用。我在我的 SerializableImmutableRangeMap 一样,所以为什么会 InvalidClassException一个无参数的构造函数:没有有效的构造当我运行我的星火应用程序?

下面是我的 SerializableImmutableRangeClass 对象和类:

 对象SerializableImmutableRangeMap扩展序列化{
  最后一类SerializableBuilder [K&LT ;:可比[_],V]()扩展序列化{
    VAL keyRanges:RangeSet [K] = TreeRangeSet.create()
    VAL rangeMap:RangeMap [K,V] = TreeRangeMap.create()    把高清(范围:范围[K],值:V):SerializableBuilder [K,V] = {
      checkNotNull(范围)
      checkNotNull(值)
      checkArgument(!range.isEmpty()范围不能是空的,但%S,范围)
      如果(!keyRanges.complement()。夹层设计(范围)){
        //这是一个错误的情况下;我们能负担得起昂贵的查找
        对于(项:项[范围[K],V< - JavaConversions.asScalaSet(rangeMap.asMapOfRanges()的entrySet())){
          VAL键:范围[K] = entry.getKey()
          如果(key.isConnected(范围)及&放大器;!key.intersection(范围).isEmpty()){
            抛出新抛出:IllegalArgumentException(
                重叠的范围:范围+范围++入门与入境重叠)
          }
        }
      }
      keyRanges.add(范围)
      rangeMap.put(范围值)
      这个
    }    清晰度的putAll(rangeMap:RangeMap〔K,_&所述;:Ⅴ]):SerializableBuilder [K,V] = {
      对于(入门< - JavaConversions.asScalaSet(rangeMap.asMapOfRanges()的entrySet())){
        把(entry.getKey(),entry.getValue())
      }
      这个
    }    打造高清():Se​​rializableImmutableRangeMap [K,V] = {
      VAL地图:java.util.Map中的[范围[K],V = rangeMap.asMapOfRanges()
      VAL rangesBuilder:ImmutableList.Builder [范围[K] =新ImmutableList.Builder [范围[K](map.size())
      VAL values​​Builder:ImmutableList.Builder [V] =新ImmutableList.Builder [V](map.size())
      对于(项:项[范围[K],V< - JavaConversions.asScalaSet(map.entrySet())){
        rangesBuilder.add(entry.getKey())
        values​​Builder.add(entry.getValue())
      }
      返回新SerializableImmutableRangeMap [K,V](rangesBuilder.build(),values​​Builder.build())
    }
  }DEF构建器[K&LT ;:可比[_],V]():Se​​rializableBuilder [K,V] = {
    新SerializableBuilder [K,V]()
  }
}类SerializableImmutableRangeMap [K&LT ;:可比[_],V](范围:ImmutableList [范围[K],值:ImmutableList [V])扩展ImmutableRangeMap [K,V](范围值)与序列化{
  高清这个(){
    这个(ImmutableList.of(),ImmutableList.of())
  }
}

和堆栈跟踪:

  java.io.InvalidClassException:com.google.common.collect.SerializableImmutableRangeMap;没有有效的构造函数
        在java.io.ObjectStreamClass中的$ ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150)
        在java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:768)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
        。在scala.collection.immutable $结肠$ colon.readObject(List.scala:362)
        在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
        在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        在java.lang.reflect.Method.invoke(Method.java:483)
        在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        在java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
        在org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:68)
        在org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:94)
        在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:60)
        在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
        在org.apache.spark.scheduler.Task.run(Task.scala:64)
        在org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:203)
        在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)
        在java.lang.Thread.run(Thread.java:745)


解决方案

有关的 序列化


  

要允许非序列化类的子类型序列化,子类型可能承担保存和恢复超类型的公共状态,保护的责任,以及(如果访问)封装领域。亚型可以假设,只有当它扩展的类有一个可访问的无参数的构造函数初始化类的状态,这个责任。它是声明一个类序列化,如果不是这种情况下的误差。该错误将在运行时检测到。


您超( ImmutableRangeMap )没有一个无参数的构造函数,而不是序列化。这就是问题。有没有要求对序列化类(如 SerializableImmutableRangeMap )。

一个无参数的构造

I created a Serializable version of Guava's ImmutableRangeMap and Builder in Scala in order to use in my Spark application. I have a zero argument constructor in my SerializableImmutableRangeMap as well, so why do I get InvalidClassException: no valid constructor when I run my Spark application?

Here is my SerializableImmutableRangeClass object and class:

object SerializableImmutableRangeMap extends Serializable {
  final class SerializableBuilder[K <: Comparable[_], V]() extends Serializable {
    val keyRanges: RangeSet[K] = TreeRangeSet.create()
    val rangeMap: RangeMap[K, V] = TreeRangeMap.create()

    def put(range: Range[K], value: V): SerializableBuilder[K, V] = {
      checkNotNull(range)
      checkNotNull(value)
      checkArgument(!range.isEmpty(), "Range must not be empty, but was %s", range)
      if (!keyRanges.complement().encloses(range)) {
        // it's an error case; we can afford an expensive lookup
        for (entry: Entry[Range[K], V] <- JavaConversions.asScalaSet(rangeMap.asMapOfRanges().entrySet())) {
          val key: Range[K] = entry.getKey()
          if (key.isConnected(range) && !key.intersection(range).isEmpty()) {
            throw new IllegalArgumentException(
                "Overlapping ranges: range " + range + " overlaps with entry " + entry)
          }
        }
      }
      keyRanges.add(range)
      rangeMap.put(range, value)
      this
    }

    def putAll(rangeMap: RangeMap[K, _ <: V]): SerializableBuilder[K, V] = {
      for (entry <- JavaConversions.asScalaSet(rangeMap.asMapOfRanges().entrySet())) {
        put(entry.getKey(), entry.getValue())
      }
      this
    }

    def build(): SerializableImmutableRangeMap[K, V] ={
      val map: java.util.Map[Range[K], V] = rangeMap.asMapOfRanges()
      val rangesBuilder: ImmutableList.Builder[Range[K]] = new ImmutableList.Builder[Range[K]](map.size())
      val valuesBuilder: ImmutableList.Builder[V] = new ImmutableList.Builder[V](map.size())
      for (entry: Entry[Range[K], V] <- JavaConversions.asScalaSet(map.entrySet())) {
        rangesBuilder.add(entry.getKey())
        valuesBuilder.add(entry.getValue())
      }
      return new SerializableImmutableRangeMap[K, V](rangesBuilder.build(), valuesBuilder.build())
    }
  }

def builder[K <: Comparable[_], V](): SerializableBuilder[K, V] = {
    new SerializableBuilder[K, V]()
  }
}

class SerializableImmutableRangeMap[K <: Comparable[_], V](ranges: ImmutableList[Range[K]], values: ImmutableList[V]) extends ImmutableRangeMap[K, V](ranges, values) with Serializable {
  def this() {
    this(ImmutableList.of(), ImmutableList.of())
  }
}

And the stack trace:

java.io.InvalidClassException: com.google.common.collect.SerializableImmutableRangeMap; no valid constructor
        at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150)
        at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:768)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
        at scala.collection.immutable.$colon$colon.readObject(List.scala:362)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
        at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:68)
        at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:94)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:60)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
        at org.apache.spark.scheduler.Task.run(Task.scala:64)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

解决方案

The relevant bit of the documentation for Serializable:

To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields. The subtype may assume this responsibility only if the class it extends has an accessible no-arg constructor to initialize the class's state. It is an error to declare a class Serializable if this is not the case. The error will be detected at runtime.

Your superclass (ImmutableRangeMap) does not have a no-arg constructor and is not Serializable. This is the problem. There is no requirement to have a no-arg constructor for Serializable classes (such as SerializableImmutableRangeMap).

这篇关于斯卡拉 - InvalidClassException:没有有效的构造的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆