package de.javakaffee.kryoserializers.guava;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
/**
* A kryo {@link Serializer} for guava-libraries {@link ImmutableMap}.
*/
public class ImmutableMapSerializer extends Serializer<ImmutableMap<Object, ? extends Object>> {
private static final boolean DOES_NOT_ACCEPT_NULL = true;
private static final boolean IMMUTABLE = true;
public ImmutableMapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}
@Override
public void write(Kryo kryo, Output output, ImmutableMap<Object, ? extends Object> immutableMap) {
kryo.writeObject(output, Maps.newHashMap(immutableMap));
}
@Override
public ImmutableMap<Object, Object> read(Kryo kryo, Input input, Class<ImmutableMap<Object, ? extends Object>> type) {
Map map = kryo.readObject(input, HashMap.class);
return ImmutableMap.copyOf(map);
}
/**
* Creates a new {@link ImmutableMapSerializer} and registers its serializer
* for the several ImmutableMap related classes.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final ImmutableMapSerializer serializer = new ImmutableMapSerializer();
kryo.register(ImmutableMap.class, serializer);
kryo.register(ImmutableMap.of().getClass(), serializer);
Object o1 = new Object();
Object o2 = new Object();
kryo.register(ImmutableMap.of(o1, o1).getClass(), serializer);
kryo.register(ImmutableMap.of(o1, o1, o2, o2).getClass(), serializer);
Map<DummyEnum,Object> enumMap = new EnumMap<DummyEnum, Object>(DummyEnum.class);
for (DummyEnum e : DummyEnum.values()) {
enumMap.put(e, o1);
}
kryo.register(ImmutableMap.copyOf(enumMap).getClass(), serializer);
}
private enum DummyEnum {
VALUE1,
VALUE2
}
}