kotlin 可通过构造函数属性和自定义设置器进行序列化

问题描述 投票:0回答:1

我想让我的一个类可序列化(kotlinx.serialization),但意识到由于 Kotlin 中的这些限制,这是不可能的:

  • 可序列化要求主构造函数中的每个参数都是属性
  • 构造函数属性不能有自定义设置器

这里有一些具有不同缺点的方法,标记为 TODO。对我来说,第三个选项似乎有点像一个解决方法。

有没有比 3. 没有样板代码更简单的解决方案?

  1. 类不能自动序列化,因为它的主要构造函数参数不是属性
// TODO: @Serializable
class Test1(
        x: Float
) {
    var x: Float = x
        set(value) {
            field = value; b = false
        }
    var b: Boolean = false
    
    fun set() {
        b = true
    }
}
  1. 无法在构造函数属性上使用自定义设置器
@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
    }
}
  1. 样板代码_x,在代码中使用_x可能会导致状态不一致
@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
    }
}
kotlin serialization setter
1个回答
0
投票

根据您的限制,您可能需要考虑拥有两个单独的对象 - 一个用于序列化,另一个用于在应用程序中使用。应用程序中使用的设置器将具有自定义设置器,要序列化的设置器将仅具有 (val) 构造函数属性。

应用内函数可以有一个

toStorage()
函数(或其他名称)来返回可序列化对象。可序列化对象可以有一个
toState()
函数(或其他名称)来创建应用内使用实例。

© www.soinside.com 2019 - 2024. All rights reserved.