Test case:
@Serializable open class Base
@Serializable class Derived(val foo: Int = 42) : Base()
fun main(args: Array<String>) {
val obj: Base = Derived()
println(JSON.stringify(obj))
}
Crashes with:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at kotlinx.serialization.internal.SerialClassDescImpl.getElementName(SerialClassDescImpl.kt:44)
at kotlinx.serialization.json.JSON$JsonOutput.writeElement(JSON.kt:251)
at kotlinx.serialization.ElementValueOutput.writeIntElementValue(Serialization.kt:377)
at Derived.write$Self(TestHierarchy.kt)
at Base$$serializer.save(TestHierarchy.kt)
at Base$$serializer.save(TestHierarchy.kt:4)
at kotlinx.serialization.KOutput.write(Serialization.kt:99)
at kotlinx.serialization.json.JSON.stringify(JSON.kt:38)
at kotlinx.serialization.json.JSON$Companion.stringify(JSON.kt:55)
at TestHierarchyKt.main(TestHierarchy.kt:12)
The workaround is to specify the derived class serializer explicitly like so
JSON.stringify(obj::class.serializer(), obj)
@arnis71 It's better to user Derived.serializer()
@sandwwraith this does not work for me :(
Using derived isn't always the solution sometimes you only know the base class but you want to serialize
Fixed in 1.3.30