Skip to content

Commit

Permalink
[SPARK-8730] Fixes - Deser objects containing a primitive class attri…
Browse files Browse the repository at this point in the history
…bute

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

Closes #7122 from EugenCepoi/master.
  • Loading branch information
EugenCepoi authored and squito committed Aug 31, 2015
1 parent f0f563a commit 72f6dbf
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 comments on commit 72f6dbf

Please sign in to comment.