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?
然后,我尝试lateinitby lazy{} ,仍然无法正常工作。 那么,我该怎么做info.force==1我现在直接使用info.force==1 ,但我仍然想知道为什么发生这种情况。

问题是属性val isForceUpdate = force == 1在类的实例化时计算一次,然后存储在一个字段中。 因为Gson正在使用Unsafe实例化该类,所以该字段被设置为其默认值false

所有你需要做的事情是修改这个属性到一个计算的属性:

 val isForceUpdate get() = force == 1 

以便在任何调用时计算该值,而不是存储在字段中。

Interesting Posts