在用gson反序列化之后,我遇到了一个我不理解的错误。我的用例要复杂得多,但是我在下面创建了这个测试,它显示了我看到的行为。问题是反序列化之后计算的 transient 值(allObjs)为空。单元测试在最后一个Assert上失败。显然,@Transient阻止了反序列化之后正确初始化allObjs。
这是预期的行为吗?我能做些什么来使字段以这种方式工作吗?
如果没有,我就必须将所有的 transient 字段转换为getThemAll()这样的函数,它确实有效。
我希望你能有什么见解。
敬上,Rob
class CoupleDeserializeTest {
data class Couple( val objA: String, val objB: String){
@Transient
val allObjs: List<String> = listOf(objA, objB)
fun getThemAll() = listOf(objA, objB)
}
@Test
fun testDe_SerializeCouple() {
val couple = Couple("my", "text")
// This succeeds
Assert.assertNotNull(couple.allObjs)
val gson = Gson()
val json = gson.toJson(couple)
// This succeeds
Assert.assertEquals("{\"objA\":\"my\",\"objB\":\"text\"}", json)
val coupleDeserialized = gson.fromJson<Couple>(json, Couple::class.java)
// This succeeds
Assert.assertNotNull(coupleDeserialized.getThemAll())
// This fails
Assert.assertNotNull(coupleDeserialized.allObjs)
}
}
1条答案
按热度按时间vx6bjr1n1#
如果您将字段标记为
Transient
,它将忽略来自序列化或反序列化的字段,片段来自JvmFlagAnnotations
编辑
它将在初始化时忽略它,因为
objA
和objB
的值将使用序列化进行初始化,这意味着objA
和objB
在您初始化allObjs
时尚未赋值,要在以后获取这些值而不是直接赋值,您可以使用get()