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

Kotlin中如何将含自定义类的全局对象存入Preferences?

解决Gson存储全局ApplicationData到SharedPreferences失败的问题

核心问题排查与修复步骤

1. 修正写入时的对象实例错误

你当前写入代码传入的ApplicationData是类对象而非全局实例,Gson无法序列化类本身,必须传入实际的全局对象实例:

// 替换为你的全局ApplicationData实例,比如ApplicationData.globalInstance
mprefs.edit().putString("MyappData", gson.toJson(ApplicationData.globalInstance)).apply()

2. 解决Parcelable类与Gson的兼容性问题

ProfileData和OVOList实现了Parcelable,默认Gson序列化可能出现字段丢失或解析失败,需做以下调整:

  • 给两个类添加无参构造函数(Gson反射实例化需要)
  • 私有字段添加@SerializedName注解,明确JSON键名,避免反射失败:
class ProfileData : Parcelable {
    @SerializedName("nickname")
    private var nickname: String? = null
    
    // 必须添加无参构造
    constructor() {}

    // 保留Parcelable原有构造与方法
    constructor(parcel: Parcel) : this() {
        nickname = parcel.readString()
    }

    // ...Parcelable接口实现方法
}

3. 修复解析时的类引用语法错误

Kotlin中获取Class对象的正确写法是ApplicationData::class.java,替换原错误写法:

val json = mprefs.getString("MyappData", "")
if (json.isNotEmpty()) {
    val obj = gson.fromJson(json, ApplicationData::class.java)
    ApplicationData.profiledata = obj.profiledata
    ApplicationData.OVOlists = obj.OVOlists
}

4. 验证SharedPreferences初始化正确性

确保mprefs是正确初始化的全局实例:

val mprefs = context.getSharedPreferences("MyAppStorage", Context.MODE_PRIVATE)

5. 捕获异常定位具体问题

添加try-catch块打印异常信息,快速定位失败原因:

// 写入时捕获异常
try {
    val jsonStr = gson.toJson(ApplicationData.globalInstance)
    mprefs.edit().putString("MyappData", jsonStr).apply()
} catch (e: Exception) {
    e.printStackTrace()
}

// 读取时捕获异常
try {
    val json = mprefs.getString("MyappData", "")
    if (json.isNotEmpty()) {
        val obj = gson.fromJson(json, ApplicationData::class.java)
        ApplicationData.profiledata = obj.profiledata
        ApplicationData.OVOlists = obj.OVOlists
    }
} catch (e: Exception) {
    e.printStackTrace()
}

内容的提问来源于stack exchange,提问作者OVO Cuenta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39