aidanvii
10/28/2021, 10:27 AMimport kotlinx.serialization.PolymorphicSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonClassDiscriminator
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
@Serializable
@JsonClassDiscriminator("__type")
sealed class Foo
@Serializable
@SerialName("bar")
class Bar : Foo()
fun main() {
val json = Json {
serializersModule = SerializersModule {
polymorphic(Foo::class) {
subclass(Bar::class)
}
}
}
// working
json.decodeFromString(Foo.serializer(), "{\"__type\":\"bar\"}").also { print(it) }
// not working
val deserializer = PolymorphicSerializer(Foo::class)
json.decodeFromString(deserializer, "{\"__type\":\"bar\"}").also { print(it) }
}
It’s not specific to interfaces, it just happens with interfaces as the base type isn’t @Serializable
(as above it only works with the generated .serializer()
on the base type)