package edu.berkeley.lipstick.util.serializer; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import edu.berkeley.lipstick.util.DataWrapper; import java.io.ByteArrayOutputStream; public class KryoDWSerializer implements IDWSerializer { private static final ThreadLocal<Kryo> threadKryo = new ThreadLocal<Kryo>(){ @Override protected Kryo initialValue() { Kryo ret = new Kryo(); ret.register(DataWrapper.class); return ret; } }; //not sure how much overhead this saves, but whatever private static final ThreadLocal<Output> threadOut = new ThreadLocal<Output>(){ @Override protected Output initialValue() { return new Output(new ByteArrayOutputStream()); } }; public byte[] toByteArray(DataWrapper input) throws Exception { Kryo kryo = threadKryo.get(); Output out = threadOut.get(); kryo.writeObject(out, input); out.flush(); byte [] ret = out.getBuffer(); out.clear(); return ret; } public DataWrapper fromByteArray(String key, byte[] input) throws Exception { Kryo kryo = threadKryo.get(); Input ink = new Input(input); return (DataWrapper) kryo.readObject(ink, DataWrapper.class); } }