Skip to content

Instantly share code, notes, and snippets.

@radium226
Created September 4, 2016 17:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save radium226/6cee45f94b8ca4c793497efbb8c8cb68 to your computer and use it in GitHub Desktop.
Save radium226/6cee45f94b8ca4c793497efbb8c8cb68 to your computer and use it in GitHub Desktop.
package com.github.radium226.gists;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.ClosureSerializer;
import java.io.*;
import java.lang.invoke.SerializedLambda;
import java.util.concurrent.Callable;
import org.objenesis.strategy.StdInstantiatorStrategy;
public class TryToSerializeLambda {
public static interface SerializableRunnable extends Serializable, Runnable {
}
public static class Unserializable {
private String value;
public Unserializable(String value) {
super();
this.value = value;
}
public String getValue() {
return value;
}
}
public static void main(String[] arguments) throws Throwable {
tryKryoSerialization();
tryIOSerialization(); // It does not work because of the unserializable instance!
}
public static void tryIOSerialization() throws Exception {
File ioFile = File.createTempFile("gists", ".io");
Unserializable unserializable = new Unserializable("Hello! ");
SerializableRunnable runnableToSerialize = () -> System.out.println(unserializable.getValue());
try (ObjectOutput output = new ObjectOutputStream(new FileOutputStream(ioFile))) {
output.writeObject(runnableToSerialize);
}
SerializableRunnable deserializedRunnable = null;
try (ObjectInput input = new ObjectInputStream(new FileInputStream(ioFile))) {
deserializedRunnable = (SerializableRunnable) input.readObject();
}
deserializedRunnable.run();
}
public static void serializeWithSerializable(Runnable runnable, File file) throws IOException {
try (ObjectOutput objectOutput = new ObjectOutputStream(new FileOutputStream(file))) {
objectOutput.writeObject(runnable);
}
}
public static void tryKryoSerialization() throws Exception {
Kryo kryo = new Kryo();
kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
kryo.register(SerializedLambda.class);
kryo.register(Class.forName(Kryo.class.getName() + "$Closure"), new ClosureSerializer());
File kryoFile = File.createTempFile("gists", ".kryo");
Unserializable unserializable = new Unserializable("Hello! ");
SerializableRunnable runnableToSerialize = () -> System.out.println(unserializable.getValue());
try (Output output = new Output(new FileOutputStream(kryoFile))) {
kryo.writeClassAndObject(output, runnableToSerialize);
}
SerializableRunnable deserializedRunnable = null;
try (Input input = new Input(new FileInputStream(kryoFile))) {
deserializedRunnable = (SerializableRunnable) kryo.readClassAndObject(input);
}
deserializedRunnable.run();
}
public static Runnable deserializeWithSerializable(File file) throws IOException, ClassNotFoundException {
try (ObjectInput objectInput = new ObjectInputStream(new FileInputStream(file))) {
Runnable runnable = (Runnable & Serializable) objectInput.readObject();
return runnable;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment