Hey everyone. I am trying to define an external se...
# serialization
m
Hey everyone. I am trying to define an external serializer for a data class (
Data
) which is defined in another gradle module (subproject) and the result is the following exception:
Copy code
Caused by: java.lang.IllegalStateException: Class Data have constructor parameters which are not properties and therefore it is not serializable automatically
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.checkSerializability(SerializerCodegen.kt:38)
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generateSerializableClassPropertyIfNeeded(SerializerCodegen.kt:106)
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generate(SerializerCodegen.kt:44)
        at org.jetbrains.kotlinx.serialization.compiler.backend.jvm.SerializerCodegenImpl$Companion.generateSerializerExtensions(SerializerCodegenImpl.kt:49)
        at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationCodegenExtension.generateClassSyntheticParts(SerializationCodegenExtension.kt:30)
        at org.jetbrains.kotlin.codegen.ImplementationBodyCodegen.generateSyntheticPartsAfterBody(ImplementationBodyCodegen.java:438)
        at org.jetbrains.kotlin.codegen.MemberCodegen.generate(MemberCodegen.java:132)
        at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:302)
        at org.jetbrains.kotlin.codegen.MemberCodegen.genClassOrObject(MemberCodegen.java:286)
        at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateClassesAndObjectsInFile(PackageCodegenImpl.java:118)
        at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generateFile(PackageCodegenImpl.java:137)
        at org.jetbrains.kotlin.codegen.PackageCodegenImpl.generate(PackageCodegenImpl.java:68)
        ... 44 more
Everything works if the data class is defined in the same gradle module as the serializer though. Has anyone here experienced this as well?
f
Can you show the data class?
m
Sure:
data class Data(val a: Int, val b: Int)
And this is the external serializer part:
Copy code
import junit.framework.Assert.assertEquals
import kotlinx.serialization.Serializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import org.junit.Test

@Serializer(forClass = Data::class)
object ExtExternalDataSerializer

class ExternalSerializerTest {
    @Test
    fun triggerBug() {
        val json = Json(JsonConfiguration.Stable.copy(unquoted = true))

        val data = Data(1, 2)
        assertEquals("{a:1,b:2}", json.stringify(ExtExternalDataSerializer, data))
        assertEquals(data, Json.parse(ExtExternalDataSerializer, "{a:1,b:2}"))
    }
}
d
Did you omit the body of the serializer?
m
Yes, I followed the instructions at https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/examples.md. And it works when the data class is in the same gradle project