package de.javakaffee.kryoserializers.guava;
import com.google.common.collect.Lists;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* A {@link Lists.ReverseList} Serializer.
* Treat as a {@link List} by reversing before write and after read.
*/
public abstract class ReverseListSerializer extends Serializer<List<Object>> {
private static final CollectionSerializer serializer = new CollectionSerializer();
@SuppressWarnings("unchecked")
@Override
public void write(Kryo kryo, Output output, List<Object> object) {
// reverse the ReverseList to get the "forward" list, and treat as regular List.
List forwardList = Lists.reverse(object);
serializer.write(kryo, output, forwardList);
}
@SuppressWarnings("unchecked")
@Override
public List<Object> copy(Kryo kryo, List<Object> original) {
List forwardList = Lists.reverse(original);
return Lists.reverse((List<Object>) serializer.copy(kryo, forwardList));
}
public static void registerSerializers(final Kryo kryo) {
kryo.register(Lists.reverse(Lists.newLinkedList()).getClass(), forReverseList());
kryo.register(Lists.reverse(Lists.newArrayList()).getClass(), forRandomAccessReverseList());
}
public static ReverseListSerializer forReverseList() {
return new ReverseListSerializer.ReverseList();
}
public static ReverseListSerializer forRandomAccessReverseList() {
return new ReverseListSerializer.RandomAccessReverseList();
}
/**
* A {@link Lists.ReverseList} implementation based on a {@link LinkedList}.
*/
private static class ReverseList extends ReverseListSerializer {
@SuppressWarnings("unchecked")
@Override
public List<Object> read(Kryo kryo, Input input, Class<List<Object>> type) {
// reading a "forward" list as a LinkedList and returning the reversed list.
List forwardList = (List) serializer.read(kryo, input, (Class) LinkedList.class);
return Lists.reverse(forwardList);
}
}
/**
* A {@link Lists.ReverseList} implementation based on an {@link ArrayList}.
*/
private static class RandomAccessReverseList extends ReverseListSerializer {
@SuppressWarnings("unchecked")
@Override
public List<Object> read(Kryo kryo, Input input, Class<List<Object>> type) {
// reading a "forward" list as a ArrayList and returning the reversed list.
List forwardList = (List) serializer.read(kryo, input, (Class) ArrayList.class);
return Lists.reverse(forwardList);
}
}
}