You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不修改Serializer接口签名,迁移至kotlinx serialization方案咨询

不修改原接口签名,迁移为kotlinx serialization实现

用户现有用于SharedPreferences序列化的Serializer接口:

interface Serializer {
  public fun <T> serialize(data: T, type: Class<T>): String
  public fun <T> deserialize(source: String, type: Class<T>): T?
}

此前基于Moshi的实现:

class SerializerImpl(
private val moshi: Moshi = Moshi.Builder()
    .build(),
) : Serializer {

override fun <T> deserialize(source: String, type: Class<T>): T? = try {
    moshi.adapter(type).fromJson(source)
} catch (exception: Exception) {
    null
}

override fun <T> serialize(data: T, type: Class<T>): String = 
   moshi.adapter(type).toJson(data)
}

解决方案

可以通过kotlinx serialization的serializer()函数,从Class<T>映射到对应的KSerializer<T>,结合Json实例完成序列化和反序列化,完全兼容原接口签名:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.serializer

class KotlinxSerializerImpl(
    private val json: Json = Json {
        // 根据业务需求配置序列化参数,例如忽略未知字段
        ignoreUnknownKeys = true
        // 是否格式化输出,默认关闭
        prettyPrint = false
    }
) : Serializer {

    override fun <T> serialize(data: T, type: Class<T>): String {
        // 通过Class获取对应的Kotlin类,再获取序列化器
        val serializer = json.serializersModule.serializer(type.kotlin)
        return json.encodeToString(serializer, data)
    }

    override fun <T> deserialize(source: String, type: Class<T>): T? = try {
        val serializer = json.serializersModule.serializer(type.kotlin)
        json.decodeFromString(serializer, source)
    } catch (e: Exception) {
        // 捕获所有序列化异常,返回null,与原Moshi实现行为一致
        null
    }
}

注意事项

  • 所有需要序列化的类必须添加@Serializable注解,这是kotlinx serialization的强制要求。
  • 原接口使用Class<T>作为类型参数,无法传递泛型类型信息(例如List<User>这类带泛型的类型),如果业务中存在这类场景,原接口本身的设计会限制处理能力,但普通非泛型类的序列化/反序列化可以完全正常工作。
  • 可以根据需求调整Json配置,比如开启encodeDefaults(序列化默认值)、设置isLenient(宽松解析JSON)等。

内容的提问来源于stack exchange,提问作者Abdelrhman Talat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:18:28