在Android中,如何使用Gson序列化可变状态数据类型?

问题描述 投票:0回答:1

正如标题所述,我正在尝试使用 Gson 库将可变状态数据类型序列化为 JSON 格式,以便可以将其保存到文件中。然而,每次我这样做时,应用程序都会崩溃。

特别是我试图将包含在数据类中的

MutableState<String>
保存到文件中。这是一些示例代码。

data class Data(
   text: MutableState<String> = mutableStateOf("")
)

我尝试使用 Gson 对其进行序列化,然后将其保存到这样的文件中。

val context = LocalContext.current
val gson = Gson
val data = Data()
var serializedData = gson.toJson(data)

var file = File(context.filesDir, "file")
file.writeText(serializedData)

尝试此操作时系统崩溃。这是日志猫所说的。

com.google.gson.JsonIOException: Interfaces can't be instantiated! Register an InstanceCreator or a TypeAdapter for this type. Interface name: androidx.compose.runtime.MutableState

它说我需要一个实例创建器或类型适配器。我不知道它是如何实现的,也不知道它们是否会真正起作用。我想这就是我来这里的原因。我有兴趣听到您的任何解决方案。

android json file serialization gson
1个回答
0
投票

您遇到这个问题是因为 MutableState 是一个接口,而 Gson 无法直接序列化或反序列化接口。默认情况下,Gson 尝试实例化类型,这对于 MutableState 这样的接口是不可能的。

要解决这个问题,您需要为 MutableState 编写自定义 TypeAdapter 或 JsonSerializer 和 JsonDeserializer。下面是使用自定义 TypeAdapter 的示例实现:

MutableState 的自定义 TypeAdapter

class MutableStateAdapter : TypeAdapter<MutableState<String>>() {
    override fun write(out: JsonWriter, value: MutableState<String>?) {
        out.value(value?.value) // Serialize only the value of MutableState
    }

    override fun read(`in`: JsonReader): MutableState<String> {
        val value = `in`.nextString() // Deserialize back to MutableState
        return mutableStateOf(value)
    }
}

您需要向您的 Gson 实例注册此 TypeAdapter:

val gson = GsonBuilder()
    .registerTypeAdapter(MutableState::class.java, MutableStateAdapter())
    .create()

更新代码

data class Data(
    val text: MutableState<String> = mutableStateOf("")
)

val context = LocalContext.current
val gson = GsonBuilder()
    .registerTypeAdapter(MutableState::class.java, MutableStateAdapter())
    .create()

val data = Data()
val serializedData = gson.toJson(data)

val file = File(context.filesDir, "file")
file.writeText(serializedData)

// To deserialize
val deserializedData: Data = gson.fromJson(file.readText(), Data::class.java)

解释

  • MutableStateAdapter 确保只有里面的值 MutableState 被序列化和反序列化。

  • mutableStateOf(value) 在期间重新创建 MutableState 对象 反序列化。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.