Created
July 26, 2014 22:34
-
-
Save twillouer/7396fad87d8797526b6d to your computer and use it in GitHub Desktop.
Kryo + Guava ImmutableList/ImmutableSet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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