Skip to content

Commit

Permalink
Merge a04cbda into 9a4f71e
Browse files Browse the repository at this point in the history
  • Loading branch information
mtbc committed Aug 19, 2016
2 parents 9a4f71e + a04cbda commit e40d135
Show file tree
Hide file tree
Showing 13 changed files with 495 additions and 3 deletions.
17 changes: 14 additions & 3 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ A project that provides [kryo](https://github.com/EsotericSoftware/kryo) (v2 and
* UUIDSerializer - serializer for java.util.UUID
* EnumMapSerializer - serializer for EnumMap
* EnumSetSerializer - serializer for EnumSet
* FieldAnnotationAwareSerializer - field serializer that either ignores fields with user specified annotations or exclusively considers such fields (e.g. useful to ignore all fields annotated with Springs `@Autowired` annotation).
* FieldAnnotationAwareSerializer - field serializer that either ignores fields with user-specified annotations or exclusively considers such fields (e.g. useful to ignore all fields annotated with Springs `@Autowired` annotation).
* GregorianCalendarSerializer - optimized serializer for (Gregorian)Calendar (24 bytes vs. 1323 bytes with FieldSerializer)
* JdkProxySerializer - for jdk proxies (proxies created via Proxy.newProxyInstance)
* KryoReflectionFactorySupport - kryo specialization that uses sun's ReflectionFactory to create new instances for classes without a default constructor
Expand All @@ -31,11 +31,16 @@ A project that provides [kryo](https://github.com/EsotericSoftware/kryo) (v2 and
* UnmodifiableCollectionsSerializer - for unmodifiable Collections and Maps created via Collections.unmodifiable*.

* cglib/CGLibProxySerializer - serializer for CGLib proxies
* guava/ArrayListMultimapSerializer - serializer for guava-libraries' ArrayListMultimap
* guava/HashMultimapSerializer -- serializer for guava-libraries' HashMultimap
* guava/ImmutableListSerializer - serializer for guava-libraries' ImmutableList
* guava/ImmutableSetSerializer - serializer for guava-libraries' ImmutableSet
* guava/ImmutableMapSerializer - serializer for guava-libraries' ImmutableMap
* guava/ImmutableMultimapSerializer - serializer for guava-libraries' ImmutableMultimap
* guava/ImmutableSortedSetSerializer - serializer for guava-libraries' ImmutableSortedSet
* guava/LinkedHashMultimapSerializer - serializer for guava-libraries' LinkedHashMultimap
* guava/LinkedListMultimapSerializer - serializer for guava-libraries' LinkedListMultimap
* guava/TreeMultimapSerializer - serializer for guava-libraries' TreeMultimap
* guava/UnmodifiableNavigableSetSerializer - serializer for guava-libraries' UnmodifiableNavigableSet
* jodatime/JodaDateTimeSerializer - serializer for joda's DateTime
* jodatime/JodaIntervalSerializer - serializer for joda's Interval
Expand Down Expand Up @@ -89,8 +94,14 @@ After that's done you can register the custom serializers at the kryo instance.
ImmutableMapSerializer.registerSerializers( kryo );
ImmutableMultimapSerializer.registerSerializers( kryo );
UnmodifiableNavigableSetSerializer.registerSerializers( kryo );

The following code snippet shows how to use the `KryoReflectionFactorySupport` (can only be used with sun/oracly jdk!) and how other serializers are registered via the `getDefaultSerializer` lookup. If you don't want to use the `KryoReflectionFactorySupport` you can override the `getDefaultSerializer` method for your `new Kryo()` instance.
// guava ArrayListMultimap, HashMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap
ArrayListMultimapSerializer.registerSerializers( kryo );
HashMultimapSerializer.registerSerializers( kryo );
LinkedHashMultimapSerializer.registerSerializers( kryo );
LinkedListMultimapSerializer.registerSerializers( kryo );
TreeMultimapSerializer.registerSerializers( kryo );

The following code snippet shows how to use the `KryoReflectionFactorySupport` (can only be used with sun/oracle jdk!) and how other serializers are registered via the `getDefaultSerializer` lookup. If you don't want to use the `KryoReflectionFactorySupport` you can override the `getDefaultSerializer` method for your `new Kryo()` instance.

final Kryo kryo = new KryoReflectionFactorySupport() {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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.ArrayListMultimap;

/**
* A kryo {@link Serializer} for guava-libraries {@link ArrayListMultimap}.
* This does not yet support {@link Kryo#copy(java.lang.Object)}.
*/
public class ArrayListMultimapSerializer extends MultimapSerializerBase<Object, Object, ArrayListMultimap<Object, Object>> {

private static final boolean DOES_NOT_ACCEPT_NULL = false;

private static final boolean IMMUTABLE = false;

public ArrayListMultimapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}

@Override
public void write(Kryo kryo, Output output, ArrayListMultimap<Object, Object> multimap) {
writeMultimap(kryo, output, multimap);
}

@Override
public ArrayListMultimap<Object, Object> read(Kryo kryo, Input input, Class<ArrayListMultimap<Object, Object>> type) {
final ArrayListMultimap<Object, Object> multimap = ArrayListMultimap.create();
readMultimap(kryo, input, multimap);
return multimap;
}

/**
* Creates a new {@link ArrayListMultimapSerializer} and registers its serializer.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final ArrayListMultimapSerializer serializer = new ArrayListMultimapSerializer();
kryo.register(ArrayListMultimap.class, serializer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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.HashMultimap;

/**
* A kryo {@link Serializer} for guava-libraries {@link HashMultimap}.
* This does not yet support {@link Kryo#copy(java.lang.Object)}.
*/
public class HashMultimapSerializer extends MultimapSerializerBase<Object, Object, HashMultimap<Object, Object>> {

private static final boolean DOES_NOT_ACCEPT_NULL = false;

private static final boolean IMMUTABLE = false;

public HashMultimapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}

@Override
public void write(Kryo kryo, Output output, HashMultimap<Object, Object> multimap) {
writeMultimap(kryo, output, multimap);
}

@Override
public HashMultimap<Object, Object> read(Kryo kryo, Input input, Class<HashMultimap<Object, Object>> type) {
final HashMultimap<Object, Object> multimap = HashMultimap.create();
readMultimap(kryo, input, multimap);
return multimap;
}

/**
* Creates a new {@link HashMultimapSerializer} and registers its serializer.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final HashMultimapSerializer serializer = new HashMultimapSerializer();
kryo.register(HashMultimap.class, serializer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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.LinkedHashMultimap;

/**
* A kryo {@link Serializer} for guava-libraries {@link LinkedHashMultimap}.
* This does not yet support {@link Kryo#copy(java.lang.Object)}.
*/
public class LinkedHashMultimapSerializer extends MultimapSerializerBase<Object, Object, LinkedHashMultimap<Object, Object>> {

private static final boolean DOES_NOT_ACCEPT_NULL = false;

private static final boolean IMMUTABLE = false;

public LinkedHashMultimapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}

@Override
public void write(Kryo kryo, Output output, LinkedHashMultimap<Object, Object> multimap) {
writeMultimap(kryo, output, multimap);
}

@Override
public LinkedHashMultimap<Object, Object> read(Kryo kryo, Input input, Class<LinkedHashMultimap<Object, Object>> type) {
final LinkedHashMultimap<Object, Object> multimap = LinkedHashMultimap.create();
readMultimap(kryo, input, multimap);
return multimap;
}

/**
* Creates a new {@link LinkedHashMultimapSerializer} and registers its serializer.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final LinkedHashMultimapSerializer serializer = new LinkedHashMultimapSerializer();
kryo.register(LinkedHashMultimap.class, serializer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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.LinkedListMultimap;

/**
* A kryo {@link Serializer} for guava-libraries {@link LinkedListMultimap}.
* This does not yet support {@link Kryo#copy(java.lang.Object)}.
*/
public class LinkedListMultimapSerializer extends MultimapSerializerBase<Object, Object, LinkedListMultimap<Object, Object>> {

private static final boolean DOES_NOT_ACCEPT_NULL = false;

private static final boolean IMMUTABLE = false;

public LinkedListMultimapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}

@Override
public void write(Kryo kryo, Output output, LinkedListMultimap<Object, Object> multimap) {
writeMultimap(kryo, output, multimap);
}

@Override
public LinkedListMultimap<Object, Object> read(Kryo kryo, Input input, Class<LinkedListMultimap<Object, Object>> type) {
final LinkedListMultimap<Object, Object> multimap = LinkedListMultimap.create();
readMultimap(kryo, input, multimap);
return multimap;
}

/**
* Creates a new {@link LinkedListMultimapSerializer} and registers its serializer.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final LinkedListMultimapSerializer serializer = new LinkedListMultimapSerializer();
kryo.register(LinkedListMultimap.class, serializer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package de.javakaffee.kryoserializers.guava;

import java.util.Map;

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.Multimap;

public abstract class MultimapSerializerBase<K, V, T extends Multimap<K, V>> extends Serializer<T> {

public MultimapSerializerBase(boolean acceptsNull, boolean immutable) {
super(acceptsNull, immutable);
}

protected void writeMultimap(Kryo kryo, Output output, Multimap<K, V> multimap) {
output.writeInt(multimap.size(), true);
for (final Map.Entry<K, V> entry : multimap.entries()) {
kryo.writeClassAndObject(output, entry.getKey());
kryo.writeClassAndObject(output, entry.getValue());
}
}

protected void readMultimap(Kryo kryo, Input input, Multimap<K, V> multimap) {
final int size = input.readInt(true);
for (int i = 0; i < size; ++i) {
final K key = (K) kryo.readClassAndObject(input);
final V value = (V) kryo.readClassAndObject(input);
multimap.put(key, value);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
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.TreeMultimap;

/**
* A kryo {@link Serializer} for guava-libraries {@link TreeMultimap}.
* The default comparator is assumed so the multimaps are not null-safe.
* This does not yet support {@link Kryo#copy(java.lang.Object)}.
*/
public class TreeMultimapSerializer extends MultimapSerializerBase<Comparable, Comparable, TreeMultimap<Comparable, Comparable>> {

/* assumes default comparator */
private static final boolean DOES_NOT_ACCEPT_NULL = true;

private static final boolean IMMUTABLE = false;

public TreeMultimapSerializer() {
super(DOES_NOT_ACCEPT_NULL, IMMUTABLE);
}

@Override
public void write(Kryo kryo, Output output, TreeMultimap<Comparable, Comparable> multimap) {
writeMultimap(kryo, output, multimap);
}

@Override
public TreeMultimap<Comparable, Comparable> read(Kryo kryo, Input input, Class<TreeMultimap<Comparable, Comparable>> type) {
final TreeMultimap<Comparable, Comparable> multimap = TreeMultimap.create();
readMultimap(kryo, input, multimap);
return multimap;
}

/**
* Creates a new {@link TreeMultimapSerializer} and registers its serializer.
*
* @param kryo the {@link Kryo} instance to set the serializer on
*/
public static void registerSerializers(final Kryo kryo) {
final TreeMultimapSerializer serializer = new TreeMultimapSerializer();
kryo.register(TreeMultimap.class, serializer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package de.javakaffee.kryoserializers.guava;

import de.javakaffee.kryoserializers.KryoTest;

import com.esotericsoftware.kryo.Kryo;

import com.google.common.collect.ArrayListMultimap;

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class ArrayListMultimapSerializerTest extends MultimapSerializerTestBase {

private Kryo _kryo;

@BeforeClass
public void initializeKyroWithSerializer() {
_kryo = new Kryo();
ArrayListMultimapSerializer.registerSerializers(_kryo);
}

@Test(dataProvider = "Google Guava multimaps")
public void testMultimap(Object[] contents) {
final ArrayListMultimap<Object, Object> multimap = ArrayListMultimap.create();
populateMultimap(multimap, contents);
final byte[] serialized = KryoTest.serialize(_kryo, multimap);
final ArrayListMultimap<Object, Object> deserialized = KryoTest.deserialize(_kryo, serialized, ArrayListMultimap.class);
assertEqualMultimaps(false, true, deserialized, multimap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package de.javakaffee.kryoserializers.guava;

import de.javakaffee.kryoserializers.KryoTest;

import com.esotericsoftware.kryo.Kryo;

import com.google.common.collect.HashMultimap;

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class HashMultimapSerializerTest extends MultimapSerializerTestBase {

private Kryo _kryo;

@BeforeClass
public void initializeKyroWithSerializer() {
_kryo = new Kryo();
HashMultimapSerializer.registerSerializers(_kryo);
}

@Test(dataProvider = "Google Guava multimaps")
public void testMultimap(Object[] contents) {
final HashMultimap<Object, Object> multimap = HashMultimap.create();
populateMultimap(multimap, contents);
final byte[] serialized = KryoTest.serialize(_kryo, multimap);
final HashMultimap<Object, Object> deserialized = KryoTest.deserialize(_kryo, serialized, HashMultimap.class);
assertEqualMultimaps(false, false, deserialized, multimap);
}
}
Loading

0 comments on commit e40d135

Please sign in to comment.