Использование Moshi PolymorphicJsonAdapterFactory с arrow.core.Option Запечатанные классы - PullRequest
0 голосов
/ 15 января 2020

При попытке использовать Moshi Polymorphi c Json Фабрика с Запечатанным Классом, определенным в Моши arrow.core.

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .add(
        PolymorphicJsonAdapterFactory.of(arrow.core.Option::class.java, "type")
            .withSubtype(arrow.core.Some::class.java, Some::class.simpleName!!)
            .withSubtype(arrow.core.None::class.java, None::class.simpleName!!)
            .withDefaultValue(None)
    )
    .build()
inline fun <reified T> getAdapter(): JsonAdapter<T> = this.moshi.adapter<T>(T::class.java).serializeNulls()
inline fun <reified T> fromJson(x: String): T = getAdapter<T>().fromJson(x)!!
inline fun <reified T> toJson(item: T): String = getAdapter<T>().toJson(item)

data class OptionTest(val x: Option<String>, val y : Option<Int>)
val obj = OptionTest(None, None)
val serialized = Json.toJson(obj)
val deserialized = Json.fromJson<OptionTest>(serialized)

Это приводит к исключению из следующего исключения:

Caused by: java.lang.IllegalArgumentException: Cannot reflectively serialize sealed class arrow.core.Option. Please register an adapter.
    at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(KotlinJsonAdapter.kt:215)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:138)
    ... 52 more

Несмотря на то, что PolymorphicJsonAdapter зарегистрирован для типа Option.

...