Skip to content

IndexOutOfBoundsException when serializing concrete class, unable to debug the error #2241

Open
@octaviospain

Description

@octaviospain

I want to create a class that can be serialized, like this

@Serializable
abstract class JsonFileRepository<E : QueryEntity>(var jsonFilepath: Path): InMemoryRepositoryBase<E>() {

     override fun add(entity: E): Boolean {
        val result = super.add(entity)

        if (result) {
            Json.encodeToString(serializer(queryEntitySerializer()), this).also { json ->
                jsonFilepath.toFile().writeText(json)
            }
        }
        return result
    }

    abstract fun queryEntitySerializer(): KSerializer<E>
}

therefore I have an implementation of it

@Serializable
class PersonJsonRepository : JsonFileRepository<Person> {

    constructor(jsonFilepath: Path) : super(jsonFilepath)

    override fun queryEntitySerializer(): KSerializer<Person> = Person.serializer()
}

where Person is

@Serializable
data class Person(override val id: Int, val name: String? = null, val money: Long? = null) : QueryEntity {
    override val uniqueId: String = "$id-$name-$money"
}

and QueryEntity is an interface irrelevant (I guess) for now.

In order to test that the PersonJsonRepository serializes itself when adding a Person element, I'm using this test written with Kotest

class JsonFileRepositoryTest : StringSpec({

    "Repository saves and loads entities" {
        val jsonFileRepository = tempfile("json-repository-test", ".json").also { it.deleteOnExit() }
        val repository = PersonJsonRepository(jsonFileRepository.toPath())
        val person = Person(1, "John Doe", 123456789L)
        repository.add(person)

        jsonFileRepository.readText() shouldBe """
            {"entitiesById":
                {   "${person.id}":
                    {   "id": ${person.id},
                        "name": "${person.name}",
                        "money": ${person.money}
                    }
                }
            }"""
    }
})

And the exception I'm getting in IntelliJ is this...

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
	at java.base/java.util.Objects.checkIndex(Objects.java:372)
	at java.base/java.util.ArrayList.get(ArrayList.java:459)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$formEncodeDecodePropertyCall$1.invoke(SerializerIrGenerator.kt:295)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$formEncodeDecodePropertyCall$1.invoke(SerializerIrGenerator.kt:288)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.serializerInstance(GeneratorHelpers.kt:935)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.serializerInstance(SerializerIrGenerator.kt:47)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.serializerInstance$instantiate(GeneratorHelpers.kt:941)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.serializerInstance(GeneratorHelpers.kt:1107)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.serializerInstance(SerializerIrGenerator.kt:47)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.formEncodeDecodePropertyCall(GeneratorHelpers.kt:1381)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.formEncodeDecodePropertyCall(SerializerIrGenerator.kt:47)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.formEncodeDecodePropertyCall(SerializerIrGenerator.kt:288)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$generateLoad$1.invoke(SerializerIrGenerator.kt:383)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$generateLoad$1.invoke(SerializerIrGenerator.kt:324)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.contributeFunction(GeneratorHelpers.kt:75)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.contributeFunction(SerializerIrGenerator.kt:47)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderExtension$DefaultImpls.contributeFunction$default(GeneratorHelpers.kt:69)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.generateLoad(SerializerIrGenerator.kt:324)
	at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generateLoadIfNeeded(SerializerCodegen.kt:116)
	at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generate(SerializerCodegen.kt:38)
...
...

As you see, the exception doesn't tell me anything about where is the bug here. If there is a bug, it does not throw a custom exception in order to fix the mistake. If there is a mistake made using the library and no bug, do you know what am I missing?

Environment

  • Kotlin version: 1.7.20
  • Library version: 1.4.1
  • Kotlin platforms: JVM
  • Gradle version: 7.5
  • IDE version (if bug is related to the IDE): IntelliJ IDEA 2022.2.4, Build #IU-222.4459.24
  • JVM 16.0.1.fx by Liberica

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