Open
Description
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