Created
September 4, 2016 17:43
-
-
Save radium226/6cee45f94b8ca4c793497efbb8c8cb68 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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