Kotlin GSON可能出现故障?还是糟糕的编码?

Kotlin GSON可能出现故障?还是糟糕的编码?,kotlin,gson,sharedpreferences,Kotlin,Gson,Sharedpreferences,我遇到了格森,几乎爱上了它。这似乎是一种通过共享首选项或内部存储立即保存对象及其包含的所有变量的非常简单的方法 问题是,当我关闭并打开应用程序时,我的数据被成功保存,而当我重新启动手机时,共享首选项/内部存储不再加载数据。他们仍然在那里,但他们掌握的数据是零 例如,我能够毫无问题地坚持这一点 fun save() { getPreferences(0).edit().putString("name", Object.name.toString()).apply() } fun load(){

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

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

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

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数据保存方法的代码。如果是的话,应用程序肯定无法通过单独关闭和打开应用程序来保存数据


也许如果它有助于解决这个问题,我在我的应用程序中将对象存储为一个单独的.kt文件 例如,我将使用自定义类示例

data class Example(
    val test: String
)
首先,您应该创建一次对象

lateinit var preferences : SharedPreferences
val gson = Gson()
val exampleType = object : TypeToken<Example>() {}.type
最后,您可以使用这两个函数保存/加载数据

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()

}

你能在日志中显示错误吗?这不是错误。在我重新启动手机后,共享首选项中几乎没有保存任何内容。如果您因为某种恶意想法(而不是像Room这样的专用数据存储解决方案)而使用共享首选项作为数据的持久性,那么您至少应该确保您的字符串在保存之前正确转义为XML。否则事情可能会失败。即使在我使用内部存储时,它也无法保存,我相信这在我看来是非常专用的。除非我再次出错?好吧,我应该如何将我的对象设置为TypeToken?我应该在盒子里放什么?仅供参考,我的对象是一个单独的kt文件,其内容如下:对象对象{var name=JSONArray()},然后我直接将值放入其中,即Object.name.put(“Billy”)在TypeToken中,您应该将存储在SharedReferences中的对象类型放入,例如String、Boolean、,例如,如果您用一个JSONArray类型的字段定义一个数据类,并将其命名为MyObject,那么您的TypeToken将如下所示:TypeToken(){}.type谢谢。但是我很确定数据类和对象是不同的。也许这就是为什么即使我尝试使用你的解决方案,它仍然不起作用。当我关闭并打开应用程序时,数据保存得很好,但当我重新启动手机时,一切都丢失了。我想我会继续找的。
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()

}