Kotlin中如何将含自定义类的全局对象存入Preferences?
核心问题排查与修复步骤
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
相关产品推荐
相关产品推荐

