nils
12/20/2023, 11:41 AMimport kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
@Serializable(with = SomeSerializer::class)
sealed class SomeClass {
@Serializable
data class Primitive(val value: String) : SomeClass()
@Serializable
data class Nested(val value: Map<String, SomeClass> /* using <..., @Contextual Any> works */) : SomeClass()
}
object SomeSerializer : KSerializer<SomeClass> {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("SomeSerializer") {
element<SomeClass.Primitive>("Primitive")
element<SomeClass.Nested>("Nested")
}
override fun deserialize(decoder: Decoder): SomeClass {
TODO("Not yet implemented")
}
override fun serialize(encoder: Encoder, value: SomeClass) {
TODO("Not yet implemented")
}
}
fun main() {
SomeSerializer
}
The above example fails with
Exception in thread "main" java.lang.ExceptionInInitializerError
at redacted.SomeSerializer$descriptor$1.invoke(Test.kt:54)
at redacted.SomeSerializer$descriptor$1.invoke(Test.kt:22)
at kotlinx.serialization.descriptors.SerialDescriptorsKt.buildClassSerialDescriptor(SerialDescriptors.kt:61)
at redacted.SomeSerializer.<clinit>(Test.kt:22)
at redacted.TestKt.main(Test.kt:38)
at redacted.TestKt.main(Test.kt)
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlinx.serialization.internal.LinkedHashMapClassDesc.<init>, parameter valueDesc
at kotlinx.serialization.internal.LinkedHashMapClassDesc.<init>(CollectionDescriptors.kt)
at kotlinx.serialization.internal.LinkedHashMapSerializer.<init>(CollectionSerializers.kt:257)
at redacted.SomeClass$Nested.<clinit>(Test.kt:16)
... 6 more
I am assuming this is caused by an initialization error in the descriptor property of the underlying serializer. Using Map<String, @Contextual Any>
works because this uses ContextualSerializer
to resolve the proper serializer at runtime.
I would like to avoid using `@Contextual`and was wondering if there might be another solution to this problem to sidestep the cyclic dependency issue.