Android 如何在kotlin中的复杂对象上正确地使用Gson进行序列化/反序列化?
对于JSON字符串,我有以下字段: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
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)
}
}