Kotlinx.serialization: IndexOutOfBoundsException when serializing base class

Created on 23 Jan 2018  路  5Comments  路  Source: Kotlin/kotlinx.serialization

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)
bug compiler-plugin

All 5 comments

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

Was this page helpful?
0 / 5 - 0 ratings