Kotlin 数据 class Gson 序列化问题
Kotlin data class Gson serialization issue
我对我的 kotlin class 没有按预期工作有点困惑:
用于检查更新信息的数据class:
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:
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 = 假 ???
然后我试了lateinit
或by lazy{}
,还是不行。
所以,我该怎么办..我现在直接使用info.force==1
,但我仍然想知道为什么会这样。
问题是 属性 val isForceUpdate = force == 1
在 class 实例化时计算一次,然后存储在一个字段中。因为 Gson 使用 Unsafe
来实例化 class,该字段被设置为其默认值 false
。
要解决此问题,您只需将 属性 更改为计算的 属性:
val isForceUpdate get() = force == 1
以便在任何调用时计算值而不是存储在字段中。
我对我的 kotlin class 没有按预期工作有点困惑:
用于检查更新信息的数据class:
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:
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 = 假 ???
然后我试了lateinit
或by lazy{}
,还是不行。
所以,我该怎么办..我现在直接使用info.force==1
,但我仍然想知道为什么会这样。
问题是 属性 val isForceUpdate = force == 1
在 class 实例化时计算一次,然后存储在一个字段中。因为 Gson 使用 Unsafe
来实例化 class,该字段被设置为其默认值 false
。
要解决此问题,您只需将 属性 更改为计算的 属性:
val isForceUpdate get() = force == 1
以便在任何调用时计算值而不是存储在字段中。