Android Kotlin - 使用 SharedPreferences 保存和检索自定义模型的 ArrayList

Android Kotlin - save and retrieve ArrayList of custom model with SharedPreferences

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

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

节省:

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 的解决方案,只要它有效并且不包含大量解决方法

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

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

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

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

只是 serialize/deserialize class 的一个实例,因此您无需关心所使用的 List 的实际运行时间:

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