Skip to content

Commit

Permalink
Correctly support registering both default polymorphic serializer & d…
Browse files Browse the repository at this point in the history
…eserializer (Kotlin#1849)

Fixes Kotlin#1837
  • Loading branch information
sandwwraith authored and pdvrieze committed Apr 29, 2022
1 parent 8157f13 commit cf3fff4
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
Expand Up @@ -153,9 +153,9 @@ public class SerializersModuleBuilder @PublishedApi internal constructor() : Ser
defaultSerializerProvider: (value: Base) -> SerializationStrategy<Base>?,
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
}
Expand All @@ -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
}
Expand Down
Expand Up @@ -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.*

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

@Test
fun testBothPolymorphicDefaults() {
val anySerializer = object : KSerializer<Any> {
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<Int> by Int.serializer() {}
Expand Down

0 comments on commit cf3fff4

Please sign in to comment.