Open
Description
To understand how to use polymorphism and generic classes I've followed the section on it in the polymorphism docs. However when the generic value is null it throws an exception. Here's an example based on the code in the docs.
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
@Serializable
sealed class Response<out T>
@Serializable
@SerialName("OkResponse")
data class OkResponse<out T>(val data: T) : Response<T>()
@Serializable
data class Item(val message: String)
fun main() {
val json = Json {
serializersModule = SerializersModule {
polymorphic(Any::class) {
subclass(Item::class)
}
}
}
println(json.encodeToString<Response<Item?>>(OkResponse(Item("hello")))) // {"type":"OkResponse","data":{"type":"Item","message":"hello"}}
println(json.encodeToString<Response<Item?>>(OkResponse(null))) // throws (see below)
}
exception:
Exception in thread "main" java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Any
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:273)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:80)
at OkResponse.write$Self(example.kt:12)
at OkResponse$$serializer.serialize(example.kt:12)
at OkResponse$$serializer.serialize(example.kt:12)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:275)
at kotlinx.serialization.json.Json.encodeToString(Json.kt:73)
at ExampleKt.main(example.kt:35)
at ExampleKt.main(example.kt)