首先DataObject不适合在DataClass上使用,因为其必须提供序列化和反序列化的特点导致的。
但我们可以采用委托类,将类的数据委托到一个jsonObject上,这样能很方便的序列化以及反序列化。在vert.x中,这样也会减少很多不必要的转换。
abstract class JsonClass(protected val base: JsonObject) {
fun toJson(): JsonObject = base
protected operator fun <V> set(p: KProperty<V>, v: V){
base.put(p.name, v)
}
protected operator fun set(key: String, v: Any?){
base.put(key, v)
}
protected operator fun <V> JsonObject.setValue(jsonClass: JsonClass, property: KProperty<*>, any: V) {
put(property.name, any)
}
protected operator fun <V> JsonObject.getValue(jsonClass: JsonClass, property: KProperty<*>): V {
return get(property.name) as V
}
}
建个基类,所有model继承于它。将toJson放到基类中,顺便给JsonObject类加一对委托方法。提供两个赋值的方法。第一个是通过属性来赋值,是类型安全的,可以避免输入字符串。
@DataObject
class Test(json: JsonObject = JsonObject()): JsonClass(json){
var name: String by base
constructor(name: String) : this(){
set(::name, name)
}
}