【问题标题】:Calculated transient value is null after deserialisation with Gson使用 Gson 反序列化后计算的瞬态值为空
【发布时间】:2021-02-09 11:31:53
【问题描述】:

在使用 gson 反序列化后,我遇到了一个我不明白的错误。 我的用例要复杂得多,但我在下面创建了这个测试,它显示了我看到的行为。 问题是反序列化后计算的瞬态值 (allObjs) 为空。单元测试在最后一个断言上失败。 显然,@Transient 在反序列化后阻止了 allObjs 的正确初始化。

这是预期的行为吗?我可以做些什么来使该领域以这种方式工作吗?

如果不是,那么我必须将所有瞬态字段转换为 getThemAll() 之类的函数,这确实有效。

我希望有任何见解。

问候,罗伯

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)
    }
}  

【问题讨论】:

    标签: kotlin gson


    【解决方案1】:

    如果您将字段标记为Transient,它将忽略该字段进行序列化或反序列化,sn-p from 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)
    }
    

    【讨论】:

    • 但显然它在初始化时也忽略了它:它是一个计算字段
    • 更新了答案,这样就不会为空了
    • 我试过了,但仍然为空,可能是因为在我的真实类中 allObjs 是从接口继承的字段
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多