rxhttp icon indicating copy to clipboard operation
rxhttp copied to clipboard

如何结合目前最新版kotlinx.serialization-1.8.1使用序列化

Open huicunjun opened this issue 8 months ago • 1 comments

目前最新对于多态,类型都需要明确指定序列化器,要带着KSerialization 到处飘,

项目内的示例无法完成多态的,any类型的序列化与反序列化,这是kotlinx.serialization本身限制

请问有最佳实践吗

class SerializationConverter(
    private val format: StringFormat,
    private val contentType: MediaType?,
) : JsonConverter {

    @Suppress("UNCHECKED_CAST")
    override fun <T : Any> convert(
        body: ResponseBody,
        type: Type,
        needDecodeResult: Boolean
    ): T {
        var json = body.string()
        if (needDecodeResult) {
            json = RxHttpPlugins.onResultDecoder(json)
        }
        if (type == String::class.java) {
            return json as T
        }
        val serializer = format.serializersModule.serializer(type)
        return format.decodeFromString(serializer, json) as T
    }

    override fun <T : Any> convert(value: T): RequestBody {
        val json = when (value) {
            is Collection<*> -> {
                JSONStringer().setSerializeCallback {
                    val serializer = format.serializersModule.serializer(it.javaClass)
                    format.encodeToString(serializer, it)
                }.write(value).toString()
            }
            is Map<*, *> -> {
                JSONStringer().setSerializeCallback {
                    val serializer = format.serializersModule.serializer(it.javaClass)
                    format.encodeToString(serializer, it)
                }.write(value).toString()
            }
            else -> {
                val serializer = format.serializersModule.serializer(value::class.java)
                format.encodeToString(serializer, value)
            }
        }
        return json.toRequestBody(contentType)
    }
}

huicunjun avatar Jun 17 '25 02:06 huicunjun

详细描述下具体场景

liujingxing avatar Jun 17 '25 02:06 liujingxing