ฉันพยายามจะสร้างชั้นเรียนอยู่ไหนแน่นอนซึ่งค่า Observable แต่ยัง Serializable.
นี่เห็นได้ชัดว่าทำงานและ serialization ทำงานแต่มันเป็นมาก boilerplate-หนักมากจะต้องเพิ่ม setter สำหรับทุกภาคสนามแล้วด้วยตนเองกำลังจะโทรหา change(...)
ในแต่ละ setter:
interface Observable {
fun change(message: String) {
println("changing $message")
}
}
@Serializable
class BlahVO : Observable {
var value2: String = ""
set(value) {
field = value
change("value2")
}
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
println(BlahVO().apply { value2 = "test2" })
อย่างถูกต้องแสดงผล
changing value2
{"value2":"test2"}
ฉันพยายามแนะนำ Delegates:
interface Observable {
fun change(message: String) {
println("changing $message")
}
@Suppress("ClassName")
class default<T>(defaultValue: T) {
private var value: T = defaultValue
operator fun getValue(observable: Observable, property: KProperty<*>): T {
return value
}
operator fun setValue(observable: Observable, property: KProperty<*>, value: T) {
this.value = value
observable.change(property.name)
}
}
}
@Serializable
class BlahVO : Observable {
var value1: String by Observable.default("value1")
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
println(BlahVO().apply { value1 = "test1" })
อย่างถูกต้องเปลี่ยนตัวกระตุ้นการตรวจสอบ,แต่มันไม่ serialize:
changing value1
{}
ถ้าฉันไปจาก Observable จะ ReadWriteProperty,
interface Observable {
fun change(message: String) {
println("changing $message")
}
fun <T> look(defaultValue: T): ReadWriteProperty<Observable, T> {
return OP(defaultValue, this)
}
class OP<T>(defaultValue: T, val observable: Observable) : ObservableProperty<T>(defaultValue) {
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
super.setValue(thisRef, property, value)
observable.change("blah!")
}
}
}
@Serializable
class BlahVO : Observable {
var value3: String by this.look("value3")
fun toJson(): String {
return Json.encodeToString(serializer(), this)
}
}
ผลคือคนเดียวกัน:
changing blah!
{}
เหมือนๆกันสำหรับ Delegates.vetoable
var value4: String by Delegates.vetoable("value4", {
property: KProperty<*>, oldstring: String, newString: String ->
this.change(property.name)
true
})
แสดงผล:
changing value4
{}
Delegates แค่ไม่ดูเหมือนจะทำงานกับ Kotlin Serialization
สิ่งที่ตัวเลือกอื่นๆจะไปที่นั่นเพื่อสังเกตการณ์เป็นทรัพย์สินเปลี่ยนแปลงได้โดยไม่ผิดของมัน serialization ว่าจะยังทำงานอีก platforms(KotlinJS,KotlinJVM,Android,...)?