Skip to content

Instantly share code, notes, and snippets.

@twillouer
Created July 26, 2014 22:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twillouer/7396fad87d8797526b6d to your computer and use it in GitHub Desktop.
Save twillouer/7396fad87d8797526b6d to your computer and use it in GitHub Desktop.
Kryo + Guava ImmutableList/ImmutableSet
public static final CollectionSerializer IMMUTABLE_SET_SERIALIZER = new CollectionSerializer() {
public Class elementClass;
public Serializer serializer;
public Class genericType;
@Override
public Collection read(Kryo kryo, Input input, Class<Collection> type)
{
ImmutableSet.Builder<?> builder = ImmutableSet.builder();
int length = input.readVarInt(true);
Serializer serializer = this.serializer;
if (genericType != null) {
if (serializer == null) {
elementClass = genericType;
serializer = kryo.getSerializer(genericType);
}
genericType = null;
}
if (serializer != null) {
for (int i = 0; i < length; i++)
builder.add(kryo.readObject(input, elementClass, serializer));
} else {
for (int i = 0; i < length; i++) {
builder.add(kryo.readClassAndObject(input));
}
}
return builder.build();
}
public void write(Kryo kryo, Output output, Collection collection)
{
int length = collection.size();
output.writeVarInt(length, true);
Serializer serializer = this.serializer;
if (genericType != null) {
if (serializer == null) {
serializer = kryo.getSerializer(genericType);
}
genericType = null;
}
if (serializer != null) {
for (Object element : collection) {
kryo.writeObject(output, element, serializer);
}
} else {
for (Object element : collection) {
kryo.writeClassAndObject(output, element);
}
}
}
/**
* @param elementClass The concrete class of each element. This saves 1-2 bytes per element. Set to null if the class is
* not known or varies per element (default).
* @param serializer The serializer to use for each element.
*/
public void setElementClass(Class elementClass, Serializer serializer)
{
this.elementClass = elementClass;
this.serializer = serializer;
}
public void setGenerics(Kryo kryo, Class[] generics)
{
this.genericType = null;
if (generics != null && generics.length > 0) {
if (kryo.isFinal(generics[0]))
genericType = generics[0];
}
}
};
private static final CollectionSerializer IMMUTABLE_LIST_SERIALIZER = new CollectionSerializer() {
public Class elementClass;
public Serializer serializer;
public Class genericType;
@Override
public Collection read(Kryo kryo, Input input, Class<Collection> type)
{
ImmutableList.Builder<?> builder = ImmutableList.builder();
int length = input.readVarInt(true);
Serializer serializer = this.serializer;
if (genericType != null) {
if (serializer == null) {
elementClass = genericType;
serializer = kryo.getSerializer(genericType);
}
genericType = null;
}
if (serializer != null) {
for (int i = 0; i < length; i++) {
builder.add(kryo.readObject(input, elementClass, serializer));
}
} else {
for (int i = 0; i < length; i++) {
builder.add(kryo.readClassAndObject(input));
}
}
return builder.build();
}
public void write(Kryo kryo, Output output, Collection collection)
{
int length = collection.size();
output.writeVarInt(length, true);
Serializer serializer = this.serializer;
if (genericType != null) {
if (serializer == null) {
serializer = kryo.getSerializer(genericType);
}
genericType = null;
}
if (serializer != null) {
for (Object element : collection) {
kryo.writeObject(output, element, serializer);
}
} else {
for (Object element : collection) {
kryo.writeClassAndObject(output, element);
}
}
}
/**
* @param elementClass The concrete class of each element. This saves 1-2 bytes per element. Set to null if the class is
* not known or varies per element (default).
* @param serializer The serializer to use for each element.
*/
public void setElementClass(Class elementClass, Serializer serializer)
{
this.elementClass = elementClass;
this.serializer = serializer;
}
public void setGenerics(Kryo kryo, Class[] generics)
{
this.genericType = null;
if (generics != null && generics.length > 0) {
if (kryo.isFinal(generics[0])) {
genericType = generics[0];
}
}
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment