twitter / chill

Scala extensions for the Kryo serialization library
https://twitter.com/scalding
Apache License 2.0
609 stars 156 forks source link

Java8 lambda expression in PriorityQueue cannot be serialized #421

Open Jiayi-Liao opened 4 years ago

Jiayi-Liao commented 4 years ago

When I'm using PriorityQueueSerializer from chill-java package, I got NPE when serializing PriorityQueue instance like this:

PriorityQueue<String> pq = new PriorityQueue<>((o1, o2) -> o1.length() - o2.length() - 1);
pq.add("1234135");
pq.add("12323424135");
java.lang.NullPointerException
    at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:80)
    at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:488)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:593)

Perhaps it's because the lambda expression is not serializable. But the strange thing is that when I removed the registration of PriorityQueueSerializer from kryo's registrations, the serialization works.

Is this expected?

johnynek commented 4 years ago

thanks for the bug report. This isn't expected. So, this is a bug. Would you be willing to open a PR with a test that shows the bug?

johnynek commented 4 years ago

note, we have a test here:

https://github.com/twitter/chill/blob/develop/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala

johnynek commented 4 years ago

here is the serializer: https://github.com/twitter/chill/blob/develop/chill-java/src/main/java/com/twitter/chill/java/PriorityQueueSerializer.java

Jiayi-Liao commented 4 years ago

@johnynek Hi, I've created a PR to reproduce the problem (not a NPE but the same strange phenomenon). Could you take a look ?

By the way I notice that this project is still using java 1.6, does it mean that the project doesn't support java 1.8 and also dosen't take the java 1.8 lambda expression into consideration?