From fb396ee2c48885091d7517d2c6d571931dfef27e Mon Sep 17 00:00:00 2001 From: Aaron Mahan Date: Wed, 5 Oct 2016 01:37:39 -0800 Subject: [PATCH] Improve ImmutableMultimapSerializer. - Add support for serializing ImmutableSetMultimap, which is missing. - Add explicit support for serializing ImmutableListMultimap (ImmutableMap delegates to ImmutableListMultimap in most cases, so it was implicitly supported). - Add tests for ImmutableSetMultimap & ImmutableListMultimap, and improve existing tests. --- .../guava/ImmutableMultimapSerializer.java | 54 +++++-- .../ImmutableMultimapSerializerTest.java | 135 ++++++++++++++++-- 2 files changed, 164 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java index 08cfbc24..013f14a1 100644 --- a/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java +++ b/src/main/java/de/javakaffee/kryoserializers/guava/ImmutableMultimapSerializer.java @@ -4,9 +4,13 @@ import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; + import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSetMultimap; import java.util.HashMap; import java.util.List; @@ -32,10 +36,20 @@ public void write(Kryo kryo, Output output, ImmutableMultimap im @Override public ImmutableMultimap read(Kryo kryo, Input input, Class> type) { - Map map = kryo.readObject(input, ImmutableMap.class); + final Map map = kryo.readObject(input, ImmutableMap.class); + final Set>> entries = map.entrySet(); + + final ImmutableMultimap.Builder builder; + if (type.equals (ImmutableListMultimap.class)) { + builder = ImmutableMultimap.builder(); + } + else if (type.equals (ImmutableSetMultimap.class)) { + builder = ImmutableSetMultimap.builder(); + } + else { + builder = ImmutableMultimap.builder(); + } - Set>> entries = map.entrySet(); - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); for (Map.Entry> entry : entries) { builder.putAll(entry.getKey(), entry.getValue()); } @@ -50,24 +64,42 @@ public ImmutableMultimap read(Kryo kryo, Input input, Class obj = ImmutableMultimap.of(); final byte[] serialized = serialize(_kryo, obj); final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); + assertEquals(deserialized, obj); } @Test - public void testImmutableListSerializerAlreadyRegistered() { - ImmutableListSerializer.registerSerializers(_kryo); - final ImmutableMultimap obj = ImmutableMultimap.of(); + public void testImmutableListMultimapEmpty() { + final ImmutableMultimap obj = ImmutableListMultimap.of(); final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); + assertEquals(deserialized, obj); } @Test - public void testImmutableMapSerializerAlreadyRegistered() { - ImmutableMapSerializer.registerSerializers(_kryo); - final ImmutableMultimap obj = ImmutableMultimap.of(); + public void testImmutableSetMultimapEmpty() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(); final byte[] serialized = serialize(_kryo, obj); - final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); assertTrue(deserialized.isEmpty()); - assertEquals(deserialized.size(), obj.size()); + assertEquals(deserialized, obj); } - @Test - public void testSingleton() { + public void testRegularSingleton() { final ImmutableMultimap obj = ImmutableMultimap.of(3, "k"); final byte[] serialized = serialize(_kryo, obj); final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); assertEquals(deserialized, obj); } + @Test + public void testImmutableListMultimapSingleton() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimapSingleton() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized.getClass(), obj.getClass()); + assertEquals(deserialized, obj); + } + @Test public void testRegular() { final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 5, "r", 6, "y"); @@ -68,6 +84,23 @@ public void testRegular() { assertEquals(deserialized, obj); } + @Test + public void testImmutableListMultimap() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimap() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 5, "r", 6, "y"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized.getClass(), obj.getClass()); + assertEquals(deserialized, obj); + } + @Test public void testRegularMultipleElementsPerKey() { final ImmutableMultimap obj = ImmutableMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); @@ -76,6 +109,52 @@ public void testRegularMultipleElementsPerKey() { assertEquals(deserialized, obj); } + @Test + public void testImmutableListMultimapMultipleElementsPerKey() { + final ImmutableMultimap obj = ImmutableListMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetMultimapMultipleElementsPerKey() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(3, "k", 3, "r", 4, "y", 4, "o"); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableMapSerializerAlreadyRegistered() { + ImmutableMapSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableListSerializerAlreadyRegistered() { + ImmutableListSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableListMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableListMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + + @Test + public void testImmutableSetSerializerAlreadyRegistered() { + ImmutableSetSerializer.registerSerializers(_kryo); + final ImmutableMultimap obj = ImmutableSetMultimap.of(); + final byte[] serialized = serialize(_kryo, obj); + final ImmutableMultimap deserialized = deserialize(_kryo, serialized, ImmutableSetMultimap.class); + assertTrue(deserialized.isEmpty()); + assertEquals(deserialized, obj); + } + // Kryo#copy tests @Test @@ -98,4 +177,32 @@ public void testCopyRegular() { final ImmutableMultimap copied = _kryo.copy(obj); assertSame(copied, obj); } + + @Test + public void testCopyImmutableListMultimap() { + final ImmutableMultimap obj = ImmutableListMultimap.of(1, "k", 2, "r", 3, "y"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableListMultimapEmpty() { + final ImmutableMultimap obj = ImmutableListMultimap.of(); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableSetMultimap() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(1, "k", 2, "r", 3, "y"); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } + + @Test + public void testCopyImmutableSetMultimapEmpty() { + final ImmutableMultimap obj = ImmutableSetMultimap.of(); + final ImmutableMultimap copied = _kryo.copy(obj); + assertSame(copied, obj); + } } \ No newline at end of file