Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在kotlin中的复杂对象上正确地使用Gson进行序列化/反序列化?_Android_Json_Serialization_Kotlin_Gson - Fatal编程技术网

Android 如何在kotlin中的复杂对象上正确地使用Gson进行序列化/反序列化?

Android 如何在kotlin中的复杂对象上正确地使用Gson进行序列化/反序列化?,android,json,serialization,kotlin,gson,Android,Json,Serialization,Kotlin,Gson,对于JSON字符串,我有以下字段: action=surveyEventName EventObject= serialized Event object (So in this field I want to serialize an object with Gson. 我遇到的问题是,当我尝试序列化事件对象时,会得到一个ANR。所以,我认为我在设置Gson序列化方面可能做错了什么 事件类的定义如下: class Event { private var mActionName = "" p

对于JSON字符串,我有以下字段:

action=surveyEventName
EventObject= serialized Event object (So in this field I want to serialize an object with Gson.
我遇到的问题是,当我尝试序列化事件对象时,会得到一个ANR。所以,我认为我在设置Gson序列化方面可能做错了什么

事件类的定义如下:

class Event {

private var mActionName = ""
private var mId = ""
private lateinit var mConditions: MutableList<(Unit) -> Boolean>
private lateinit var mActions: MutableList<(Unit) -> Boolean>

fun getActionName(): String {
    return this.mActionName
}

fun setActionName(actionName: String) {
    this.mActionName = actionName
}

fun getId(): String {
    return this.mId
}

fun setId(id: String) {
    this.mId = id
}

fun addSingleCondition(condition: (Unit) -> Boolean) {
    if(::mConditions.isInitialized) {
        mConditions.add(condition)
    } else {
        mConditions = mutableListOf(condition)
    }
}

fun addSingleAction(action: (Unit) -> Boolean) {
    if(::mActions.isInitialized) {
        mActions.add(action)
    } else {
        mActions = mutableListOf(action)
    }
}

companion object {
    fun serializeEventList(event: List<Event>): String {
        return Gson().toJson(event) // ANR HERE!
    }

    fun deserializeEventList(jsonString: String): MutableList<Event> {
        return Gson().fromJson(jsonString,
                object : TypeToken<List<Event>>() {}.type)
    }
}
}
之后,我反序列化JSON eventobjectfield以再次使用事件对象,但是当我尝试序列化时,我得到了ANR


我不确定Gson是否工作不正常,因为我已将lambda添加到事件对象中。我可能做错了什么?

我在一些实现中遇到了这个问题,直到我意识到如果您在使用Gson时保持谨慎,它的工作效果会更好。我发现在我的代码中有两件事情不太好:

1) lateinit变量:由于某种原因,Gson在解析带有这些变量的类时挂起。 2) 具有重写值的成员变量或属性的继承:基本上

如果我覆盖继承的值,Gson会抱怨我有两个定义了相同名称的变量,示例如下:

open class Person() {
    var id = 0
    var name = ""
    var age = 0
}

class AdultPerson() : Person() {
    override var age = 18
}
Gson会抱怨对象有两个同名的变量。为了解决这个问题,我必须在构造函数块或init块中更改age的默认值,以不重写变量

所以,考虑到这两件事,我设法让Gson将我的对象转换为字符串,即使它们有复杂的继承、集合或带有集合变量的类

我已经优化了以前的Gson解析器,使其能够与其他类一起工作,到目前为止,它运行良好:

GsonParser.kt

object GsonParser {
    inline fun <reified T> toJson(src: T): String {
        return Gson().toJson(src)
    }

    inline fun <reified T> fromJson(src: String): T {
        val type = object : TypeToken<T>() {}.type
        return Gson().fromJson(src, type)
    }
}
对象语法分析器{
内联JSON(src:T):字符串{
返回Gson().toJson(src)
}
inline-fun-fromJson(src:String):T{
val type=object:TypeToken(){}.type
返回Gson().fromJson(src,type)
}
}
希望有帮助

object GsonParser {
    inline fun <reified T> toJson(src: T): String {
        return Gson().toJson(src)
    }

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