我想让我的一个类可序列化(kotlinx.serialization),但意识到由于 Kotlin 中的这些限制,这是不可能的:
这里有一些具有不同缺点的方法,标记为 TODO。对我来说,第三个选项似乎有点像一个解决方法。
有没有比 3. 没有样板代码更简单的解决方案?
// TODO: @Serializable
class Test1(
x: Float
) {
var x: Float = x
set(value) {
field = value; b = false
}
var b: Boolean = false
fun set() {
b = true
}
}
@Serializable
class Test2(
// TODO: b is not reset everytime x is updated
var x: Float
) {
// TODO: Can't define setter for constructor property
// var x: Float = x
// set(value) {
// field = value; b = false
// }
var b: Boolean = false
fun set() {
b = true
}
}
@Serializable
class Test3(
@SerialName("x")
private var _x: Float
) {
var x: Float
get() = _x
set(value) {
_x = value; b = false
}
var b: Boolean = false
fun set() {
b = true
}
}
根据您的限制,您可能需要考虑拥有两个单独的对象 - 一个用于序列化,另一个用于在应用程序中使用。应用程序中使用的设置器将具有自定义设置器,要序列化的设置器将仅具有 (val) 构造函数属性。
应用内函数可以有一个
toStorage()
函数(或其他名称)来返回可序列化对象。可序列化对象可以有一个 toState()
函数(或其他名称)来创建应用内使用实例。