Closed as not planned
Description
Specifying a custom serializer for an interface doesn't work at top-level.
Related to #928 and maybe #1077.
To Reproduce
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.json.*
@Serializable(with = FooSerializer::class)
interface Foo {
val value: String
}
class FooImpl(override val value: String) : Foo
object FooSerializer : KSerializer<Foo> {
override val descriptor: SerialDescriptor =
PrimitiveSerialDescriptor("Foo", PrimitiveKind.STRING)
override fun deserialize(decoder: Decoder): Foo =
FooImpl(decoder.decodeString())
override fun serialize(encoder: Encoder, value: Foo) {
encoder.encodeString(value.value)
}
}
@Serializable
class Wrapper(val wrapped: Foo)
fun main() {
val foo: Foo = FooImpl("abc")
println(Json.encodeToString(Wrapper(foo))) // {"wrapped":"abc"}
println(Json.encodeToString(foo)) // Serializer for class 'Foo' is not found.
}
Exception in thread "main" kotlinx.serialization.SerializationException: Serializer for class 'Foo' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
at kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered(Platform.common.kt:91)
at kotlinx.serialization.internal.PlatformKt.platformSpecificSerializerNotRegistered(Platform.kt:29)
at kotlinx.serialization.SerializersKt__SerializersKt.serializer(Serializers.kt:59)
at kotlinx.serialization.SerializersKt.serializer(Unknown Source)
at MainKt.main(Main.kt:51)
at MainKt.main(Main.kt)
Expected behavior
The second encodeToString
invocation should use the same serializer for Foo
as the serializer for Wrapper
does implicitly.
Environment
- Kotlin version: 1.4.21
- Library version: 1.0.1
- Kotlin platforms: JVM