package org.corfudb.util.serializer;
import com.esotericsoftware.kryo.Kryo;
import de.javakaffee.kryoserializers.guava.ImmutableListSerializer;
import de.javakaffee.kryoserializers.guava.ImmutableMapSerializer;
import de.javakaffee.kryoserializers.guava.ImmutableMultimapSerializer;
import de.javakaffee.kryoserializers.guava.ImmutableSetSerializer;
import io.netty.buffer.ByteBuf;
import org.corfudb.runtime.CorfuRuntime;
import org.objenesis.strategy.StdInstantiatorStrategy;
/**
* This class represents a serializer, which takes an object and reads/writes it to a bytebuf.
* Created by mwei on 9/17/15.
*/
public interface ISerializer {
// Used for default cloning.
ThreadLocal<Kryo> kryos = new ThreadLocal<Kryo>() {
protected Kryo initialValue() {
Kryo kryo = new Kryo();
// Use an instantiator that does not require no-args
kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
ImmutableListSerializer.registerSerializers(kryo);
ImmutableSetSerializer.registerSerializers(kryo);
ImmutableMapSerializer.registerSerializers(kryo);
ImmutableMultimapSerializer.registerSerializers(kryo);
// configure kryo instance, customize settings
return kryo;
}
;
};
byte getType();
/**
* Deserialize an object from a given byte buffer.
*
* @param b The bytebuf to deserialize.
* @return The deserialized object.
*/
Object deserialize(ByteBuf b, CorfuRuntime rt);
/**
* Serialize an object into a given byte buffer.
*
* @param o The object to serialize.
* @param b The bytebuf to serialize it into.
*/
void serialize(Object o, ByteBuf b);
/**
* Clone an object through serialization.
*
* @param o The object to clone.
* @return The cloned object.
*/
default Object clone(Object o, CorfuRuntime rt) {
return kryos.get().copy(o);
}
}