gpt4 book ai didi

kotlin - Delegates.observable() 可以序列化吗?

转载 作者:行者123 更新时间:2023-12-02 13:24:25 25 4
gpt4 key购买 nike

给定一个类(class)

class Pizza(name: String?) : Serializable {
var name: String? by Delegates.observable(name, {_,_,_ -> })
}

为什么这不是可序列化的?它崩溃了
Caused by: java.io.NotSerializableException: com.xxx.xxx.Pizza$$special$$inlined$observable$1

最佳答案

您的问题背后的原因是委托(delegate)作为数组存储在合成支持字段中,该字段既没有标记为 transient 也没有可序列化,因此它可以防止序列化。但是,仅使用 @Transient 标记属性可能会破坏您的序列化表单。并且可能根本不起作用

在 JetBrains 决定对此问题做出最终解决方案之前,您应该使用 writeReplacereadResolve覆盖默认的序列化机制。我在下面提供了一个示例解决方案:

class Pizza(name: String?) : Serializable {
@Transient var name: String? by Delegates.observable(name)
private fun writeReplace(stream: ObjectOutputStream): Object = SerialProxy(name)
private class SerialProxy(var name: String): Serializable {
private fun readResolve(): Object = Pizza(name)
}
}

readObject()/writeObject() 不起作用,因为在不使用反射的情况下调用构造函数后,您无法设置委托(delegate)。

关于kotlin - Delegates.observable() 可以序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44705900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com