From a1096a314a1d65b9c06e57390241ef6e4abbdca6 Mon Sep 17 00:00:00 2001 From: "P. Oscar Boykin" Date: Tue, 5 Nov 2013 14:41:26 -0800 Subject: [PATCH 1/2] Support AsJava/AsScala --- .../com/twitter/chill/ScalaKryoInstantiator.scala | 13 +++++++++++++ .../src/test/scala/com/twitter/chill/KryoSpec.scala | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index 83601d84..a98d3e43 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -43,6 +43,8 @@ import scala.util.matching.Regex import com.twitter.chill.java.PackageRegistrar import _root_.java.io.Serializable +import scala.collection.JavaConverters._ + /** This class has a no-arg constructor, suitable for use with reflection instantiation * It has no registered serializers, just the standard Kryo configured for Kryo. */ @@ -87,6 +89,17 @@ class ScalaKryoInstantiator extends EmptyScalaKryoInstantiator { class ScalaCollectionsRegistrar extends IKryoRegistrar { def apply(newK: Kryo) { + // for binary compat this is here, but could be moved to RichKryo + def useField[T](cls: Class[T]) { + newK.register(cls, + new com.esotericsoftware.kryo.serializers.FieldSerializer(newK, cls)) + } + // The wrappers are private classes: + useField(List(1, 2, 3).asJava.getClass) + useField(Map(1 -> 2, 4 -> 3).asJava.getClass) + useField(new _root_.java.util.ArrayList().asScala.getClass) + useField(new _root_.java.util.HashMap().asScala.getClass) + /* * Note that subclass-based use: addDefaultSerializers, else: register * You should go from MOST specific, to least to specific when using diff --git a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala index 811573f3..1b306cad 100644 --- a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala +++ b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala @@ -23,6 +23,8 @@ import scala.collection.mutable.{ArrayBuffer => MArrayBuffer, HashMap => MHashMa import _root_.java.util.PriorityQueue import _root_.java.util.Locale import scala.collection.mutable +import scala.collection.JavaConverters._ + /* * This is just a test case for Kryo to deal with. It should * be outside KryoSpec, otherwise the enclosing class, KryoSpec @@ -82,6 +84,10 @@ class KryoSpec extends Specification with BaseProperties { Vector(1,2,3,4,5), TestValMap(null), Some("junk"), + List(1, 2, 3).asJava, + Map("hey" -> 1, "you" -> 2).asJava, + new _root_.java.util.ArrayList(Seq(1, 2, 3).asJava).asScala, + new _root_.java.util.HashMap[Int,Int](Map(1 -> 2, 3 -> 4).asJava).asScala, (), 'hai) .asInstanceOf[List[AnyRef]] From 6c42f05e0422badf074168fd997bbcc317579f82 Mon Sep 17 00:00:00 2001 From: "P. Oscar Boykin" Date: Tue, 5 Nov 2013 16:25:12 -0800 Subject: [PATCH 2/2] Fix for 2.10 --- .../scala/com/twitter/chill/ScalaKryoInstantiator.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index a98d3e43..d9c0c773 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -91,11 +91,13 @@ class ScalaCollectionsRegistrar extends IKryoRegistrar { def apply(newK: Kryo) { // for binary compat this is here, but could be moved to RichKryo def useField[T](cls: Class[T]) { - newK.register(cls, - new com.esotericsoftware.kryo.serializers.FieldSerializer(newK, cls)) + val fs = new com.esotericsoftware.kryo.serializers.FieldSerializer(newK, cls) + fs.setIgnoreSyntheticFields(false) // scala generates a lot of these attributes + newK.register(cls, fs) } // The wrappers are private classes: useField(List(1, 2, 3).asJava.getClass) + useField(List(1, 2, 3).iterator.asJava.getClass) useField(Map(1 -> 2, 4 -> 3).asJava.getClass) useField(new _root_.java.util.ArrayList().asScala.getClass) useField(new _root_.java.util.HashMap().asScala.getClass)