如何将依赖于类类型的类似代码减少到父级?

时间:2018-07-05 18:52:21

标签: kotlin jackson

我正在使用Jackson-Kotlin在我的kotlin项目中序列化和反序列化JSON对象。问题是我必须在每个类中定义相同的方法,而只更改一个typeValue。这似乎是非常糟糕的做法,因此我将向社区介绍解决这种情况的最佳方法。

示例:

class User: Model() {
    //...
    companion object {

        fun fromJson(json: String): User {
            return ObjectMapper().registerKotlinModule().readValue<User>(json)
        }

        fun toJson(user: User): String {
            return ObjectMapper().registerKotlinModule().writeValueAsString(user)
        }


    }
}

class Friend: Model() {
    //...
    companion object {

        fun fromJson(json: String): User {
            return ObjectMapper().registerKotlinModule().readValue<Friend>(json)
        }

        fun toJson(friend: Friend): String {
            return ObjectMapper().registerKotlinModule().writeValueAsString(user)
        }


    }
}

如您所见,除了readValue<>()方法上的type参数之外,代码非常相似。有没有办法我可以在Model()类中定义一个方法,而不是在从Model继承的每个类上定义一个方法?

2 个答案:

答案 0 :(得分:1)

您似乎可以在这里雇用generics

伴侣对象没有类的类型参数的概念,因为它们不是类的实例,因此您可以使函数的实例方法被继承:

-x imports

或让函数本身接受类型参数:

class Model<T> {
    fun fromJson(json: String): User {
        return ObjectMapper().registerKotlinModule().readValue<T>(json)
    }

    fun toJson(friend: T): String {
        return ObjectMapper().registerKotlinModule().writeValueAsString(friend)
    }
}

答案 1 :(得分:0)

You don't want to create an ObjectMapper and register a module each time.

class Model {
    companion object {
        // could be public if you want to do anything else with it
        private val objectMapper = ObjectMapper().registerKotlinModule()

        inline fun <reified T : Model> fromJson(json: String): User {
            return objectMapper.readValue<T>(json)
        }

        fun toJson(value: Model): String {
            return objectMapper.writeValueAsString(value)
        }
    }
}

使用:

val friend = Model.fromJson<Friend>(...)

,或者只有Model.fromJson(...)(如果有预期的类型)。

也来自同一页面:

  

输入:如果有字节[],则最好。 InputStream次之;其次是Reader -在任何情况下,请不要尝试将输入读取为字符串!

     

输出:OutputStream最佳;作家第二名;并调用writeValueAsString()效率最低(为什么构造中间String?)