使用Gson进行反序列化后,计算的 transient 值为空

xzabzqsa  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(225)

在用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)
    }
}
vx6bjr1n

vx6bjr1n1#

如果您将字段标记为Transient,它将忽略来自序列化或反序列化的字段,片段来自JvmFlagAnnotations

/**
 * Marks the JVM backing field of the annotated property as `transient`, meaning that it is not
 * part of the default serialized form of the object.
 */
@Target(FIELD)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
public actual annotation class Transient

编辑

它将在初始化时忽略它,因为objAobjB的值将使用序列化进行初始化,这意味着objAobjB在您初始化allObjs时尚未赋值,要在以后获取这些值而不是直接赋值,您可以使用get()

data class Couple( val objA: String, val objB: String){
     @Transient
     val allObjs: List<String>
           get() = listOf(objA, objB)

     fun getThemAll() = listOf(objA, objB)
}

相关问题