【问题标题】:Android Kotlin - save and retrieve ArrayList of custom model with SharedPreferencesAndroid Kotlin - 使用 SharedPreferences 保存和检索自定义模型的 ArrayList
【发布时间】:2025-12-03 14:20:04
【问题描述】:

在您将其标记为重复之前,我已经看到了类似的问题,并且在我尝试时没有一个解决方案有效!

这是我根据“解决方案”中的答案进行尝试的方法:

保存:

val gson = Gson()
val hiddenUserList: ArrayList<HiddenUserModel> = ArrayList()
hiddenUserList.add(HiddenUserModel(777L, "steveee"))
hiddenUserList.add(HiddenUserModel(888L, "donbimbo"))
val json = gson.toJson(hiddenUserList)
prefs.edit().putString("hiddenUser", json).apply()

到目前为止,我猜它是正确的?

现在当我尝试检索和阅读它时:

if(prefs.getString("hiddenUser", null) != null){
    val hiddenUserListBack: ArrayList<HiddenUserModel> = ArrayList()
    val gsonBack = Gson()
    val jsonBack: String = prefs.getString("hiddenUser", null)!!
    val obj: ArrayList<HiddenUserModel> = gsonBack.fromJson(jsonBack, hiddenUserListBack::class.java)

    Log.d(tagg, obj[0].nickname + " " + obj[1].nickname) 
}

我明白了:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.website.blaaa.models.HiddenUserModel

这里有什么问题?

我也接受没有 gson 的解决方案,只要它有效并且不包含大量解决方法

【问题讨论】:

标签: android kotlin gson


【解决方案1】:

尝试让 Gson 决定要将列表反序列化到的集合的实际类型。例如,创建一个带有List 字段的类:

data class UserBag(val users: List<HiddenUserModel>)

然后把你的用户放在那里,序列化并保存:

...
val json = gson.toJson(UserBag(users = hiddenUserListBack))
prefs.edit().putString("hiddenUser", json).apply()

只是序列化/反序列化该类的实例,因此您不必关心使用的 List 的实际运行时:

val userBag = gsonBack.fromJson(jsonBack, UserBag::class.java)
userBag.users.forEach {
    Log.d(tagg, "User nickname: ${it.nickname}") 
}

【讨论】:

  • 不错的解决方法,谢谢!
最近更新 更多