From 6323a0b7c82b84c2e9128341533a1399c072b040 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Thu, 31 Oct 2019 15:13:22 -0400 Subject: [PATCH] Don't allow toJson() serialization on polymorphic default values This type explicitly indicates an unknown value. This is an explosive case, but an alternative could be to just write null into the writer? --- .../PolymorphicJsonAdapterFactory.java | 3 +++ .../PolymorphicJsonAdapterFactoryTest.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java index 27527a3..88cb8c5 100644 --- a/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java +++ b/adapters/src/main/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactory.java @@ -275,6 +275,9 @@ public final class PolymorphicJsonAdapterFactory implements JsonAdapter.Facto } @Override public void toJson(JsonWriter writer, Object value) throws IOException { + if (defaultValueSet && value == defaultValue) { + throw new IllegalArgumentException("Cannot serialize default value instance: " + value); + } Class type = value.getClass(); int labelIndex = subtypes.indexOf(type); if (labelIndex == -1) { diff --git a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java index ffc479e..37a3b1c 100644 --- a/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java +++ b/adapters/src/test/java/com/squareup/moshi/adapters/PolymorphicJsonAdapterFactoryTest.java @@ -105,6 +105,24 @@ public final class PolymorphicJsonAdapterFactoryTest { assertThat(message).isNull(); } + @Test public void toJsonDefaultValue() { + Error fallbackError = new Error(Collections.emptyMap()); + Moshi moshi = new Moshi.Builder() + .add(PolymorphicJsonAdapterFactory.of(Message.class, "type") + .withSubtype(Success.class, "success") + .withSubtype(Error.class, "error") + .withDefaultValue(fallbackError)) + .build(); + JsonAdapter adapter = moshi.adapter(Message.class); + + try { + String json = adapter.toJson(fallbackError); + fail(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessageContaining("Cannot serialize default value instance"); + } + } + @Test public void unregisteredSubtype() { Moshi moshi = new Moshi.Builder() .add(PolymorphicJsonAdapterFactory.of(Message.class, "type")