Skip to content

Commit 216ea9c

Browse files
authored
Correctly support registering both default polymorphic serializer & deserializer (#1849)
Fixes #1837
1 parent 83003e0 commit 216ea9c

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

core/commonMain/src/kotlinx/serialization/modules/SerializersModuleBuilders.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,9 @@ public class SerializersModuleBuilder @PublishedApi internal constructor() : Ser
153153
defaultSerializerProvider: (value: Base) -> SerializationStrategy<Base>?,
154154
allowOverwrite: Boolean
155155
) {
156-
val previous = polyBase2DefaultDeserializerProvider[baseClass]
156+
val previous = polyBase2DefaultSerializerProvider[baseClass]
157157
if (previous != null && previous != defaultSerializerProvider && !allowOverwrite) {
158-
throw IllegalArgumentException("Default serializers provider for class $baseClass is already registered: $previous")
158+
throw IllegalArgumentException("Default serializers provider for $baseClass is already registered: $previous")
159159
}
160160
polyBase2DefaultSerializerProvider[baseClass] = defaultSerializerProvider
161161
}
@@ -168,7 +168,7 @@ public class SerializersModuleBuilder @PublishedApi internal constructor() : Ser
168168
) {
169169
val previous = polyBase2DefaultDeserializerProvider[baseClass]
170170
if (previous != null && previous != defaultDeserializerProvider && !allowOverwrite) {
171-
throw IllegalArgumentException("Default deserializers provider for class $baseClass is already registered: $previous")
171+
throw IllegalArgumentException("Default deserializers provider for $baseClass is already registered: $previous")
172172
}
173173
polyBase2DefaultDeserializerProvider[baseClass] = defaultDeserializerProvider
174174
}

core/commonTest/src/kotlinx/serialization/modules/ModuleBuildersTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package kotlinx.serialization.modules
99
import kotlinx.serialization.*
1010
import kotlinx.serialization.builtins.*
1111
import kotlinx.serialization.descriptors.*
12+
import kotlinx.serialization.encoding.*
1213
import kotlin.reflect.*
1314
import kotlin.test.*
1415

@@ -305,6 +306,21 @@ class ModuleBuildersTest {
305306
assertEquals<Any?>(Unit.serializer(), m2.getPolymorphic(Any::class, serializedClassName = "foo"))
306307
}
307308

309+
@Test
310+
fun testBothPolymorphicDefaults() {
311+
val anySerializer = object : KSerializer<Any> {
312+
override val descriptor: SerialDescriptor get() = error("descriptor")
313+
override fun serialize(encoder: Encoder, value: Any): Unit = error("serialize")
314+
override fun deserialize(decoder: Decoder): Any = error("deserialize")
315+
}
316+
val module = SerializersModule {
317+
polymorphicDefaultDeserializer(Any::class) { _ -> anySerializer }
318+
polymorphicDefaultSerializer(Any::class) { _ -> anySerializer }
319+
}
320+
assertEquals(anySerializer, module.getPolymorphic(Any::class, 42))
321+
assertEquals(anySerializer, module.getPolymorphic(Any::class, serializedClassName = "42"))
322+
}
323+
308324
@Test
309325
fun testPolymorphicForStandardSubtypesOfAny() {
310326
val serializer = object : KSerializer<Int> by Int.serializer() {}

0 commit comments

Comments
 (0)