From cf3fff494006b850bbee01ece34a5b5ea1bb125f Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 22 Feb 2022 15:31:41 +0300 Subject: [PATCH] Correctly support registering both default polymorphic serializer & deserializer (#1849) Fixes #1837 --- .../modules/SerializersModuleBuilders.kt | 6 +++--- .../serialization/modules/ModuleBuildersTest.kt | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt b/core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt index 530f42647..4c14f4b94 100644 --- a/core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt +++ b/core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt @@ -153,9 +153,9 @@ public class SerializersModuleBuilder @PublishedApi internal constructor() : Ser defaultSerializerProvider: (value: Base) -> SerializationStrategy?, allowOverwrite: Boolean ) { - val previous = polyBase2DefaultDeserializerProvider[baseClass] + val previous = polyBase2DefaultSerializerProvider[baseClass] if (previous != null && previous != defaultSerializerProvider && !allowOverwrite) { - throw IllegalArgumentException("Default serializers provider for class $baseClass is already registered: $previous") + throw IllegalArgumentException("Default serializers provider for $baseClass is already registered: $previous") } polyBase2DefaultSerializerProvider[baseClass] = defaultSerializerProvider } @@ -168,7 +168,7 @@ public class SerializersModuleBuilder @PublishedApi internal constructor() : Ser ) { val previous = polyBase2DefaultDeserializerProvider[baseClass] if (previous != null && previous != defaultDeserializerProvider && !allowOverwrite) { - throw IllegalArgumentException("Default deserializers provider for class $baseClass is already registered: $previous") + throw IllegalArgumentException("Default deserializers provider for $baseClass is already registered: $previous") } polyBase2DefaultDeserializerProvider[baseClass] = defaultDeserializerProvider } diff --git a/core/commonTest/src/kotlinx/serialization/modules/ModuleBuildersTest.kt b/core/commonTest/src/kotlinx/serialization/modules/ModuleBuildersTest.kt index edbd9d6f4..b4122cfd0 100644 --- a/core/commonTest/src/kotlinx/serialization/modules/ModuleBuildersTest.kt +++ b/core/commonTest/src/kotlinx/serialization/modules/ModuleBuildersTest.kt @@ -9,6 +9,7 @@ package kotlinx.serialization.modules import kotlinx.serialization.* import kotlinx.serialization.builtins.* import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* import kotlin.reflect.* import kotlin.test.* @@ -305,6 +306,21 @@ class ModuleBuildersTest { assertEquals(Unit.serializer(), m2.getPolymorphic(Any::class, serializedClassName = "foo")) } + @Test + fun testBothPolymorphicDefaults() { + val anySerializer = object : KSerializer { + override val descriptor: SerialDescriptor get() = error("descriptor") + override fun serialize(encoder: Encoder, value: Any): Unit = error("serialize") + override fun deserialize(decoder: Decoder): Any = error("deserialize") + } + val module = SerializersModule { + polymorphicDefaultDeserializer(Any::class) { _ -> anySerializer } + polymorphicDefaultSerializer(Any::class) { _ -> anySerializer } + } + assertEquals(anySerializer, module.getPolymorphic(Any::class, 42)) + assertEquals(anySerializer, module.getPolymorphic(Any::class, serializedClassName = "42")) + } + @Test fun testPolymorphicForStandardSubtypesOfAny() { val serializer = object : KSerializer by Int.serializer() {}