Skip to content

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

@huicunjun

Description

@huicunjun

目前最新对于多态,类型都需要明确指定序列化器,要带着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)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions