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

Moshi从1.8.0升级至1.12.0后覆盖安装转换器返回null问题

问题根因与解决方案

该异常由Moshi 1.9.0及以上版本对Kotlin数据类的序列化/反序列化规则变更导致,核心涉及两个兼容性变动:

  1. Kotlin 1.4+修改了参数名默认存储规则,配合Moshi 1.9+的字段匹配逻辑,会对未显式声明序列化注解的字段出现匹配失败
  2. Moshi 1.8.0序列化数据时默认不会写入带默认值的构造参数字段,升级到1.12.0后如果未开启Kotlin适配器的容错逻辑,反序列化时会直接返回null而非用默认值填充

修复步骤

  • 检查Moshi实例初始化配置,优先添加Kotlin专属适配器工厂,注意必须放在其他自定义工厂之前:
val moshi = Moshi.Builder()
    // Kotlin适配器工厂必须放在第一个位置
    .add(KotlinJsonAdapterFactory())
    // 其他自定义适配器
    .add(/*自定义适配器实例*/)
    .build()
  • 给所有用于SharedPreference、Room序列化的data class添加@JsonClass(generateAdapter = true)注解,显式指定使用代码生成适配器,规避反射适配的兼容性问题:
@JsonClass(generateAdapter = true)
data class LocalStorageBean(
    val id: String,
    val count: Int = 0
)
  • 兼容旧版本已存储的序列化数据,开启容错配置,关闭未知字段异常抛出:
val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .failOnUnknown(false)
    .build()
  • 检查依赖配置,保证所有Moshi相关组件版本完全统一:
implementation "com.squareup.moshi:moshi:1.12.0"
implementation "com.squareup.moshi:moshi-kotlin:1.12.0"
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.12.0"

完成配置后清理项目重新构建即可,覆盖安装场景的反序列化会自动兼容旧版存储数据,不会丢失用户本地存储内容。

内容的提问来源于stack exchange,提问作者S.Murugan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:48:03