斯卡拉 - InvalidClassException:没有有效的构造 [英] Scala - InvalidClassException: no valid constructor
问题描述
我创建了一个序列化
版本番石榴的 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())
}
这个
} 打造高清():SerializableImmutableRangeMap [K,V] = {
VAL地图:java.util.Map中的[范围[K],V = rangeMap.asMapOfRanges()
VAL rangesBuilder:ImmutableList.Builder [范围[K] =新ImmutableList.Builder [范围[K](map.size())
VAL valuesBuilder:ImmutableList.Builder [V] =新ImmutableList.Builder [V](map.size())
对于(项:项[范围[K],V< - JavaConversions.asScalaSet(map.entrySet())){
rangesBuilder.add(entry.getKey())
valuesBuilder.add(entry.getValue())
}
返回新SerializableImmutableRangeMap [K,V](rangesBuilder.build(),valuesBuilder.build())
}
}DEF构建器[K&LT ;:可比[_],V]():SerializableBuilder [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'sImmutableRangeMap
andBuilder
in Scala in order to use in my Spark application. I have a zero argument constructor in mySerializableImmutableRangeMap
as well, so why do I getInvalidClassException: 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 notSerializable
. This is the problem. There is no requirement to have a no-arg constructor forSerializable
classes (such asSerializableImmutableRangeMap
).这篇关于斯卡拉 - InvalidClassException:没有有效的构造的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!