gpt4 book ai didi

java - 如何在 Kotlin 中向 Gson 注册一个 InstanceCreator?

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:41 28 4
gpt4 key购买 nike

我可以使用代码 1 来保存 MutableList<MDetail>正确使用 Gson 到 json 字符串,但是当我尝试恢复时出现错误 MutableList<MDetail>来自带有代码 2 的 json 字符串的对象。搜索了一些资源,好像需要注册一个InstanceCreator。

我怎样才能写一个寄存器 InstanceCreator用 Kotlin 写代码?谢谢!

错误

Caused by: java.lang.RuntimeException: Unable to invoke no-args constructor for interface model.DeviceDef. Registering an InstanceCreator with Gson for this type may fix this problem.

代码 1

private var listofMDetail: MutableList<MDetail>?=null
mJson = Gson().toJson(listofMDetail) //Save

代码 2

var mJson: String by PreferenceTool(this, getString(R.string.SavedJsonName) , "")
var aMListDetail= Gson().fromJson<MutableList<MDetail>>(mJson)

inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)

我的类(class)

interface DeviceDef

data class BluetoothDef(val status:Boolean=false): DeviceDef
data class WiFiDef(val name:String, val status:Boolean=false) : DeviceDef

data class MDetail(val _id: Long, val deviceList: MutableList<DeviceDef>)
{
inline fun <reified T> getDevice(): T {
return deviceList.filterIsInstance(T::class.java).first()
}
}

已添加

在我使用 val myGson = GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create() 之后, 当我使用 open class DeviceDef 时我可以得到正确的结果,为什么?

open class DeviceDef

data class BluetoothDef(val status:Boolean=false): DeviceDef()
data class WiFiDef(val name:String, val status:Boolean=false) : DeviceDef()

val adapter = RuntimeTypeAdapterFactory
.of(DeviceDef::class.java)
.registerSubtype(BluetoothDef::class.java)
.registerSubtype(WiFiDef::class.java)


data class MDetail(val _id: Long, val deviceList: MutableList<DeviceDef>)
{
inline fun <reified T> getDevice(): T {
return deviceList.filterIsInstance(T::class.java).first()
}
}

val myGson = GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create()

最佳答案

Gson 在你的 MutableList<DeviceDef> 中很难反序列化多态对象。 .这是您需要做的:

  1. 添加 RuntimeTypeAdapterFactory.java手动添加到您的项目(似乎不是 part of gson library )。另见 answer .

  2. 更改代码以使用工厂

    创建 Gson实例:

    val adapter = RuntimeTypeAdapterFactory
    .of(DeviceDef::class.java)
    .registerSubtype(BluetoothDef::class.java)
    .registerSubtype(WiFiDef::class.java)

    val gson = GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create()
  3. 在工厂中注册您的每个子类型,它将按预期工作:)

关于java - 如何在 Kotlin 中向 Gson 注册一个 InstanceCreator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48050487/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com