Skip to content

Custom interface serializer cannot be found at top-level #1291

Closed as not planned
@fluidsonic

Description

@fluidsonic

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions