不修改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
相关产品推荐
相关产品推荐

