Skip to content

null values of generic types in polymorphic classes throw NPE #1604

Open
@lnhrdt

Description

@lnhrdt

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)

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