From 22e87daf4c8a5fe520a3808186b9a50aadb7eebb Mon Sep 17 00:00:00 2001 From: Thomas Groh Date: Thu, 11 May 2017 17:16:53 -0700 Subject: [PATCH] Enable SerializableCoder to Serialize with Generic Types A TypeToken that contains generics is not serializable. However, the TypeDescriptor does not need to be transmitted via the serialized form, so mark it as transient. --- .../src/main/resources/beam/findbugs-filter.xml | 10 ++++++++++ .../org/apache/beam/sdk/coders/SerializableCoder.java | 5 ++++- .../apache/beam/sdk/coders/SerializableCoderTest.java | 8 +++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml b/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml index 1db0e86d6afc..8ff0cb02eb3c 100644 --- a/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml +++ b/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml @@ -73,6 +73,16 @@ --> + + + + + + + diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/SerializableCoder.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/SerializableCoder.java index 9aa8493e5e71..66918768818f 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/SerializableCoder.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/SerializableCoder.java @@ -107,7 +107,7 @@ public Coder coderFor(TypeDescriptor typeDescriptor, } private final Class type; - private final TypeDescriptor typeDescriptor; + private transient TypeDescriptor typeDescriptor; protected SerializableCoder(Class type, TypeDescriptor typeDescriptor) { this.type = type; @@ -166,6 +166,9 @@ public int hashCode() { @Override public TypeDescriptor getEncodedTypeDescriptor() { + if (typeDescriptor == null) { + typeDescriptor = TypeDescriptor.of(type); + } return typeDescriptor; } diff --git a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java index adb665286eee..dd4f6ca345cd 100644 --- a/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java +++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/coders/SerializableCoderTest.java @@ -125,11 +125,17 @@ public void testSerializableCoderConstruction() throws Exception { assertEquals(coder.getRecordType(), MyRecord.class); CoderProperties.coderSerializable(coder); - SerializableCoder decoded = SerializableUtils.clone(coder); assertThat(decoded.getRecordType(), Matchers.equalTo(MyRecord.class)); } + @Test + public void testSerializableCoderIsSerializableWithGenericTypeToken() + throws Exception { + SerializableCoder coder = SerializableCoder.of(new TypeDescriptor() {}); + CoderProperties.coderSerializable(coder); + } + @Test public void testNullEquals() { SerializableCoder coder = SerializableCoder.of(MyRecord.class);