Hello, I am running into problems when using kotli...
# serialization
n
Hello, I am running into problems when using kotlinx.serialization with sealed classes that contain references to the parent type. Minimal example:
Copy code
import 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
Copy code
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.