I'm creating a Kotlin Multiplatform library; actually I got 3 modules ( common, jvm and js ),
In the classpath I got: classpath "org.jetbrains.kotlin:kotlin-serialization:${versions.kotlin}"
And in my modules I got:
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${versions.kotlinSerialization}"
"org.jetbrains.kotlinx:kotlinx-serialization-runtime:${versions.kotlinSerialization}"
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:${versions.kotlinSerialization}"
and apply plugin: 'kotlinx-serialization'
ofc.
But when I run this simple test:
@Serializable
data class ASimpleClass( val a: Int )
.
@Test
fun testingMultiplatformCode_canSerialize() {
JSON.stringify( ASimpleClass( 1 ) )
}
I got this error:
kotlinx.serialization.SerializationException: Can't locate argument-less serializer for class studio.forface.ktmdb.ASimpleClass. For generic classes, such as lists, please provide serializer explicitly.
at kotlinx.serialization.PlatformUtilsKt.serializer(PlatformUtils.kt:28)
at studio.forface.ktmdb.ProjectTests.testingMultiplatformCode_canSerialize(ProjectTests.kt:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
I have same result annotating the property "a" ( @SerialName
), which shouldn't require an annotation anyway.
Am I missing something? :/ thanks
The error indicates that serialization plugin was not actually applied.
In your config classpath line:
classpath "org.jetbrains.kotlin:kotlin-serialization:${versions.kotlin}"
has not applied plugin because it can't infer version from property versions.kotlin
. You need to define this value in buildscript
block or try inline kotlin version like that
classpath "org.jetbrains.kotlin:kotlin-serialization:1.3.10"
or use Plugins API. Replace buildscript block in root build.gradle with:
plugins {
id "kotlinx-serialization" version "1.3.10" apply false
// ... another plugins
}
And add following to root settings.gradle:
pluginManagement {
resolutionStrategy {
eachPlugin {
if (requested.id.id == "kotlinx-serialization") {
useModule("org.jetbrains.kotlin:kotlin-serialization:${requested.version}")
}
}
}
}
Also, if you are configuring multiplatform project, you likely need to add 'multiplatform' plugin as described in Kotlin docs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With