Skip to content

Commit 3f1f826

Browse files
committed
reproduce exception with PriorityQueue with lambda expression
1 parent 396eacf commit 3f1f826

File tree

3 files changed

+76
-7
lines changed

3 files changed

+76
-7
lines changed

build.sbt

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ val sharedSettings = mimaDefaultSettings ++ Seq(
3131
scalariformPreferences := formattingPreferences,
3232
scalariformAutoformat := false,
3333
// Twitter Hadoop needs this, sorry 1.7 fans
34-
javacOptions ++= Seq("-target", "1.6", "-source", "1.6", "-Xlint:-options"),
35-
javacOptions in doc := Seq("-source", "1.6"),
34+
javacOptions ++= Seq("-target", "1.8", "-source", "1.8", "-Xlint:-options"),
35+
javacOptions in doc := Seq("-source", "1.8"),
3636
resolvers ++= Seq(
3737
Opts.resolver.sonatypeSnapshots,
3838
Opts.resolver.sonatypeReleases
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.twitter.chill.java;
2+
3+
import com.esotericsoftware.kryo.Kryo;
4+
import com.esotericsoftware.kryo.io.Input;
5+
import com.esotericsoftware.kryo.io.Output;
6+
7+
import java.util.Comparator;
8+
import java.util.PriorityQueue;
9+
10+
public class TestPriorityQueue {
11+
12+
private static final Kryo kryo = new Kryo();
13+
14+
private static final PriorityQueue<String> test_priority_queue1 =
15+
new PriorityQueue<>((o1, o2) -> o1.length() - o2.length() - 1);
16+
17+
private static final PriorityQueue<String> test_priority_queue2 =
18+
new PriorityQueue<>(new Comparator<String>() {
19+
@Override
20+
public int compare(String o1, String o2) {
21+
return o1.length() - o2.length() - 1;
22+
}
23+
});
24+
25+
static {
26+
test_priority_queue1.add("12345");
27+
test_priority_queue1.add("123");
28+
test_priority_queue1.add("12456789");
29+
30+
test_priority_queue2.add("12345");
31+
test_priority_queue2.add("123");
32+
test_priority_queue2.add("12456789");
33+
}
34+
35+
public static PriorityQueue<String> serializeAndDeserializeQueue1() {
36+
Output output = new Output(1000, -1);
37+
kryo.writeClassAndObject(output, test_priority_queue1);
38+
Input input = new Input(output.toBytes());
39+
return (PriorityQueue<String>) kryo.readClassAndObject(input);
40+
}
41+
42+
public static PriorityQueue<String> serializeAndDeserializeQueue1(Kryo kryo) {
43+
Output output = new Output(1000, -1);
44+
kryo.writeClassAndObject(output, test_priority_queue1);
45+
Input input = new Input(output.toBytes());
46+
return (PriorityQueue<String>) kryo.readClassAndObject(input);
47+
}
48+
49+
public static PriorityQueue<String> serializeAndDeserializeQueue2(Kryo kryo) {
50+
Output output = new Output(1000, -1);
51+
kryo.writeClassAndObject(output, test_priority_queue2);
52+
Input input = new Input(output.toBytes());
53+
return (PriorityQueue<String>) kryo.readClassAndObject(input);
54+
}
55+
}

chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala

+19-5
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,8 @@ limitations under the License.
1616

1717
package com.twitter.chill.java
1818

19-
import org.scalatest._
20-
2119
import com.esotericsoftware.kryo.Kryo
22-
import com.esotericsoftware.kryo.io.Input
23-
import com.esotericsoftware.kryo.io.Output
24-
20+
import com.esotericsoftware.kryo.io.{Input, Output}
2521
import org.objenesis.strategy.StdInstantiatorStrategy
2622
import org.scalatest.matchers.should.Matchers
2723
import org.scalatest.wordspec.AnyWordSpec
@@ -34,6 +30,24 @@ class PriorityQueueSpec extends AnyWordSpec with Matchers {
3430
k.readClassAndObject(in).asInstanceOf[A]
3531
}
3632

33+
"A PriorityQueue Serializer" should {
34+
"serialize PriorityQueue with lambda expression" in {
35+
36+
val kryo = new Kryo()
37+
kryo.setInstantiatorStrategy(new StdInstantiatorStrategy)
38+
PriorityQueueSerializer.registrar()(kryo)
39+
40+
// this works well without registered PriorityQueueSerializer
41+
TestPriorityQueue.serializeAndDeserializeQueue1()
42+
43+
// this works well with registered PriorityQueueSerializer and PriorityQueue instance (with non-lambda expression)
44+
TestPriorityQueue.serializeAndDeserializeQueue2(kryo)
45+
46+
// this should work well but failed with PriorityQueueSerializer registered in kryo and PriorityQueue instance (with lambda expression)
47+
TestPriorityQueue.serializeAndDeserializeQueue1(kryo)
48+
}
49+
}
50+
3751
"A PriorityQueue Serializer" should {
3852
"handle PriorityQueue" in {
3953
import scala.collection.JavaConverters._

0 commit comments

Comments
 (0)