При попытке использовать 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.