andylamax
07/03/2020, 11:45 AM@Serializable
sealed class Result<out T> {
@Serializable
class Success<out T>(val data: T) : Result<T>()
@Serializable
class Failure<out T>(val msg: String) : Result<T>()
companion object {
private fun <T> resultContext(serializer: KSerializer<T>) = SerializersModule {
polymorphic<Result<T>> {
subclass(Success.serializer(serializer))
subclass(Failure.serializer(serializer))
}
}
fun <T> stringify(serializer: KSerializer<T>, res: Result<T>): String {
return Json(context = resultContext(serializer)).stringify(
Result.serializer(serializer),
res
)
}
fun <T> parse(serializer: KSerializer<T>, json: String): Result<T> {
return Json(context = resultContext(serializer)).parse(
Result.serializer(serializer),
json
)
}
}
}}
So that If I have a class
@Serializable
data class Person(val name:String)
I can call
Result.stringify(Result.Serializer(Person.serializer()),Result.Success(Person("Andy))) // This says class Person is not registered for polymorphic serialization
I have little knowledge in Polymorphic Serialization.
Also, I need to be able to serialize a Result.Success<Person?>(null)
. Currently I don't know how to do so. Help?kursivee
07/03/2020, 1:11 PMfun <T> stringify(serializer: KSerializer<T>, res: Result<T>): String {
return Json(context = resultContext(serializer)).stringify(
PolymorphicSerializer(Result::class),
res
)
}
andylamax
07/03/2020, 9:32 PMkursivee
07/03/2020, 9:38 PMResult.stringify(Person.serializer(), Result.Success(Person("Andy")))
kursivee
07/03/2020, 9:39 PM@Serializable
sealed class Result<out T> {
@Serializable
class Success<out T>(val data: T) : Result<T>()
@Serializable
class Failure<out T>(val msg: String) : Result<T>()
companion object {
private fun <T> resultContext(serializer: KSerializer<T>) = SerializersModule {
polymorphic<Result<T>> {
subclass(Success.serializer(serializer))
subclass(Failure.serializer(serializer))
}
}
fun <T> stringify(serializer: KSerializer<T>, res: Result<T>): String {
return Json(context = resultContext(serializer)).stringify(
PolymorphicSerializer(Result::class),
res
)
}
fun <T> parse(serializer: KSerializer<T>, json: String): Result<T> {
return Json(context = resultContext(serializer)).parse(
PolymorphicSerializer(Result::class),
json
) as Result<T>
}
}
}
@Serializable
data class Person(val name: String?)
fun main(args: Array<String>) {
val jsonData = Result.stringify(Person.serializer(), Result.Success(Person("hey")))
println(jsonData)
when(val data = Result.parse(Person.serializer(), jsonData)) {
is Result.Success -> println(data.data)
is Result.Failure -> println(data.msg)
}
}
andylamax
07/03/2020, 10:36 PMpolymorphic<Any> {
subclass(serializer)
}
in the SerializersModule
Then the error goes away. But again, I can't serialize Result.Success<Person?>(null)