Skip to content
Snippets Groups Projects
Commit 72f6dbf7 authored by EugenCepoi's avatar EugenCepoi Committed by Imran Rashid
Browse files

[SPARK-8730] Fixes - Deser objects containing a primitive class attribute

Author: EugenCepoi <cepoi.eugen@gmail.com>

Closes #7122 from EugenCepoi/master.
parent f0f563a3
No related branches found
No related tags found
No related merge requests found
......@@ -62,17 +62,34 @@ private[spark] class JavaDeserializationStream(in: InputStream, loader: ClassLoa
extends DeserializationStream {
private val objIn = new ObjectInputStream(in) {
override def resolveClass(desc: ObjectStreamClass): Class[_] = {
// scalastyle:off classforname
Class.forName(desc.getName, false, loader)
// scalastyle:on classforname
}
override def resolveClass(desc: ObjectStreamClass): Class[_] =
try {
// scalastyle:off classforname
Class.forName(desc.getName, false, loader)
// scalastyle:on classforname
} catch {
case e: ClassNotFoundException =>
JavaDeserializationStream.primitiveMappings.get(desc.getName).getOrElse(throw e)
}
}
def readObject[T: ClassTag](): T = objIn.readObject().asInstanceOf[T]
def close() { objIn.close() }
}
private object JavaDeserializationStream {
val primitiveMappings = Map[String, Class[_]](
"boolean" -> classOf[Boolean],
"byte" -> classOf[Byte],
"char" -> classOf[Char],
"short" -> classOf[Short],
"int" -> classOf[Int],
"long" -> classOf[Long],
"float" -> classOf[Float],
"double" -> classOf[Double],
"void" -> classOf[Void]
)
}
private[spark] class JavaSerializerInstance(
counterReset: Int, extraDebugInfo: Boolean, defaultClassLoader: ClassLoader)
......
......@@ -25,4 +25,22 @@ class JavaSerializerSuite extends SparkFunSuite {
val instance = serializer.newInstance()
instance.deserialize[JavaSerializer](instance.serialize(serializer))
}
test("Deserialize object containing a primitive Class as attribute") {
val serializer = new JavaSerializer(new SparkConf())
val instance = serializer.newInstance()
instance.deserialize[JavaSerializer](instance.serialize(new ContainsPrimitiveClass()))
}
}
private class ContainsPrimitiveClass extends Serializable {
val intClass = classOf[Int]
val longClass = classOf[Long]
val shortClass = classOf[Short]
val charClass = classOf[Char]
val doubleClass = classOf[Double]
val floatClass = classOf[Float]
val booleanClass = classOf[Boolean]
val byteClass = classOf[Byte]
val voidClass = classOf[Void]
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment