GSON可能出现故障?还是编码不好?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GSON可能出现故障?还是编码不好?相关的知识,希望对你有一定的参考价值。

我遇到了GSON,我几乎爱上了它。这似乎是一种非常简单的方法,可以通过共享首选项或内部存储立即保存对象及其中包含的所有变量。

问题是,当我关闭并打开应用程序时,我的数据成功保留,当我重新启动手机时,共享首选项/内部存储不再加载数据。他们仍在那里,但他们持有的数据为零。

例如,我能够毫无问题地坚持这一点

fun save() {
getPreferences(0).edit().putString("name", Object.name.toString()).apply()
}

fun load(){

Object.name = JSONArray(getPreferences(0).getString("name", Object.name)
}

但是,任何通过GSON转换进行相同操作的尝试都无法在手机重启后产生相同的结果。当我打开和关闭应用程序时,数据保存没问题。

fun save(){
getPreferences(0).edit().putString("Object", Gson().toJson(Object)).commit()
}

fun load(){
var copiedObject = Gson().fromJson(getPreferences(0).getString("Object", Gson().toJson(Object)), Object.javaClass)

Object.name = copiedObject.name
}

我不确定是不是因为我错误地编写了GSON数据保存方法的代码。如果是这样,应用程序肯定无法通过单独关闭和打开应用程序来保存数据。

也许如果它有助于解决这个问题,我将Object存储为我的应用程序中的单独.kt文件。

答案

如果要在SharedPreferences中存储自定义对象,则应考虑将Gson与TypeTokens一起使用。

例如,我将使用自定义类Example

data class Example(
    val test: String
)

首先,您应该创建一次对象。

lateinit var preferences : SharedPreferences
val gson = Gson()
val exampleType = object : TypeToken<Example>() {}.type

然后初始化这样的首选项(如果您使用的是默认的SharedPreferences):

preferences = PreferenceManager.getDefaultSharedPreferences(this)

最后,您可以使用这两个功能保存/加载数据

fun load() : Example? {
    return gson.fromJson(preferences.getString("example", null), exampleType) as Example?
}

fun save(example: Example) {
    preferences.edit().putString("example", gson.toJson(example)).apply()

}

以上是关于GSON可能出现故障?还是编码不好?的主要内容,如果未能解决你的问题,请参考以下文章

金山文档打一个字以后点哪个都不好使死机了

RecyclerView未显示已解析的GSON数据

海尔空调故障代码f12

python3连接MSSQL数据库 中文乱码怎么解决

西门子S7-200 CPU224出现三个灯都变黄是啥状况??CPU坏了吗?(有图)

POJ2778DNA Sequence(AC自动机)