You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by se...@apache.org on 2014/11/26 18:51:27 UTC

[3/3] incubator-flink git commit: [Scala API] Case Class serializer can work with classes that cannot be instantiated empty

[Scala API] Case Class serializer can work with classes that cannot be instantiated empty


Project: http://git-wip-us.apache.org/repos/asf/incubator-flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-flink/commit/112b3a93
Tree: http://git-wip-us.apache.org/repos/asf/incubator-flink/tree/112b3a93
Diff: http://git-wip-us.apache.org/repos/asf/incubator-flink/diff/112b3a93

Branch: refs/heads/master
Commit: 112b3a937a1644982f24174163085c582b471f8c
Parents: 48b6d01
Author: Stephan Ewen <se...@apache.org>
Authored: Wed Nov 26 17:23:00 2014 +0100
Committer: Stephan Ewen <se...@apache.org>
Committed: Wed Nov 26 18:14:59 2014 +0100

----------------------------------------------------------------------
 .../scala/typeutils/CaseClassSerializer.scala   | 35 ++++++++++++--------
 1 file changed, 21 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/112b3a93/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/CaseClassSerializer.scala
----------------------------------------------------------------------
diff --git a/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/CaseClassSerializer.scala b/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/CaseClassSerializer.scala
index 61b876f..f82a67f 100644
--- a/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/CaseClassSerializer.scala
+++ b/flink-scala/src/main/scala/org/apache/flink/api/scala/typeutils/CaseClassSerializer.scala
@@ -33,15 +33,29 @@ abstract class CaseClassSerializer[T <: Product](
 
   @transient var fields : Array[AnyRef] = _
   
+  @transient var instanceCreationFailed : Boolean = false
   
   def createInstance: T = {
-    initArray()
-    var i = 0
-    while (i < arity) {
-      fields(i) = fieldSerializers(i).createInstance()
-      i += 1
+    if (instanceCreationFailed) {
+      null.asInstanceOf[T]
+    }
+    else {
+      initArray()
+      try {
+        var i = 0
+        while (i < arity) {
+          fields(i) = fieldSerializers(i).createInstance()
+          i += 1
+        }
+        createInstance(fields)
+      }
+      catch {
+        case t: Throwable => {
+          instanceCreationFailed = true
+          null.asInstanceOf[T]
+        }
+      }
     }
-    createInstance(fields)
   }
 
   def copy(from: T, reuse: T): T = {
@@ -68,14 +82,7 @@ abstract class CaseClassSerializer[T <: Product](
   }
 
   def deserialize(reuse: T, source: DataInputView): T = {
-    initArray()
-    var i = 0
-    while (i < arity) {
-      val field = reuse.productElement(i).asInstanceOf[AnyRef]
-      fields(i) = fieldSerializers(i).deserialize(field, source)
-      i += 1
-    }
-    createInstance(fields)
+    deserialize(source);
   }
   
   def deserialize(source: DataInputView): T = {