作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我可以使用代码 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>
中很难反序列化多态对象。 .这是您需要做的:
添加 RuntimeTypeAdapterFactory.java手动添加到您的项目(似乎不是 part of gson library )。另见 answer .
更改代码以使用工厂
创建 Gson
实例:
val adapter = RuntimeTypeAdapterFactory
.of(DeviceDef::class.java)
.registerSubtype(BluetoothDef::class.java)
.registerSubtype(WiFiDef::class.java)
val gson = GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create()
在工厂中注册您的每个子类型,它将按预期工作:)
关于java - 如何在 Kotlin 中向 Gson 注册一个 InstanceCreator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48050487/
我是一名优秀的程序员,十分优秀!