Kotlin数据类Gson序列化问题
林有点困惑我的kotlin类没有按预期工作:
用于检查更新信息的数据类:
data class UpdateInfo constructor(//kotlin class val description: String, val force: Int, val platform: String, val title: String, val url: String, @SerializedName("version") val versionCode: Int = 0 ) : Serializable { val isForceUpdate = force == 1 }
还用于解码对象形式JSON的util:
public class JsonUtil {//java class private static final Gson gson; static { BooleanAdapter booleanAdapter = new BooleanAdapter(); gson = new GsonBuilder() .serializeNulls() .disableHtmlEscaping() .setLenient() .registerTypeAdapter(Boolean.class, booleanAdapter) .registerTypeAdapter(boolean.class, booleanAdapter) .create(); } }
当我测试它时:
val json = "{\"force\"=\"1\"}" val info = JsonUtil.fromJsonObject(json, UpdateInfo::class.java) println(info) println(info.force == 1) println(info.isForceUpdate)
我得到:
UpdateInfo(description=null, force=1, platform=null, title=null, url=null,versionCode=0) true false
什么?? info.isForceUpdate = false?
然后,我尝试lateinit
或by lazy{}
,仍然无法正常工作。 那么,我该怎么做info.force==1
我现在直接使用info.force==1
,但我仍然想知道为什么发生这种情况。
问题是属性val isForceUpdate = force == 1
在类的实例化时计算一次,然后存储在一个字段中。 因为Gson正在使用Unsafe
实例化该类,所以该字段被设置为其默认值false
。
所有你需要做的事情是修改这个属性到一个计算的属性:
val isForceUpdate get() = force == 1
以便在任何调用时计算该值,而不是存储在字段中。