NoClassDefFoundError сериализация kotlinx

У меня есть мультиплатформенный проект kotlin, и мне нужно serialize класс. Я включил следующую зависимость в свои commonMain и androidMain и iosMain соответственно в свой multiplatform gradle file:

 //commonMain
 implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:0.20.0"

 //androidMain
 implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0"

 //iosMain
 implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:0.20.0"

Это тот класс, который я хочу serialize:

@Serializable
class Test {

    fun toJsonTestClass() = Json.stringify(Test.serializer(), this)
    var value1:Double = 0.toDouble()
       
    companion object {

        fun buildClass(value1 : Double):Test {

            val test = Test()
            test.value1 = value1
   
            return test
        }

         fun fromJsonTestClass(json:String) = Json.parse(Test.serializer(), json)
    }
}

А в другом классе (TrialClass) я его тестирую вот так:

val test = Test()
val testToJson = test.toJsonTestClass() //<- This is where the error is pointing to.

println(testToJson)

Но когда я его запускаю, я получаю следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlinx/serialization/json/Json
  at Test.toJsonTestClass(Test.kt:28)
  at TrialClass.main(TrialClass.kt:4)
Caused by: java.lang.ClassNotFoundException: kotlinx.serialization.json.Json

У меня нет проблем при импорте в мой класс, но при запуске я получаю вышеупомянутую ошибку.

Любая помощь или совет будут высоко оценены.


person Community    schedule 16.08.2020    source источник


Ответы (2)


Вероятно, ваш класс запутан. У вас есть два варианта:

Добавьте аннотацию @Keep над классом:

@Serializable
@Keep
class Teste {
// ...
}...

или добавьте его в proguard вашего модуля:

-keep (path_to_the_class).test.** { *; }
person Augusto Carmo    schedule 16.08.2020
comment
Благодарю за ваш ответ. Я не лучший в proguard, поэтому хочу использовать аннотацию Keep, но по какой-то причине я не могу найти ее в Kotlin Multiplatform. Есть ли конкретная библиотека, которую я должен включить? - person ; 16.08.2020
comment
Я так не думаю, но вы должны import androidx.annotation.Keep. - person Augusto Carmo; 16.08.2020
comment
Понял. Я даже не мог import androidx.annotation.Keep. Вместо этого я пошел по пути proguard, и это сработало. Большое спасибо за ваше время и усилия. - person ; 16.08.2020
comment
Я рад, что у вас это сработало. Совет: попробуйте перенести свой проект на AndroidX: developer.android.com/jetpack/androidx/migrate < / а> - person Augusto Carmo; 16.08.2020
comment
Просто быстрый вопрос, поскольку мой класс находится в пакете commonMain, я не могу использовать аннотацию `@ Keep`, знаете ли вы, есть ли что-нибудь похожее на эту аннотацию keep? - person ; 16.08.2020
comment
Я уже видел, как некоторые люди создавали interface, добавляли его в proguard, и всякий раз, когда вам нужно, чтобы какой-то класс или перечисление не запутывались, вы заставляете их реализовывать этот интерфейс. Но переход на androidx - действительно хорошее дело :) - person Augusto Carmo; 16.08.2020
comment
Замечательно, звучит хорошо. Большое вам спасибо еще раз. - person ; 16.08.2020

В моем случае я все сделал правильно - код и конфигурация. И gradle clean не помогло, я получил волшебство Invalidate Caches / Restart от IntelliJ IDEA.

person Jing Li    schedule 22.11.2020