Existe-t-il un moyen simple ou une méthode de bibliothèque standard pour convertir un objet de classe de données Kotlin en une carte/dictionnaire de ses propriétés par des noms de propriété? La réflexion peut-elle être évitée?
J'ai le même cas d'utilisation aujourd'hui pour les tests et j'ai fini par utiliser le mappeur d'objets Jackson pour convertir la classe de données Kotlin en carte. Les performances d'exécution ne sont pas un gros problème dans mon cas. Je n'ai pas vérifié les détails, mais je pense que cela utilise la réflexion sous le capot, mais cela ne préoccupe pas, comme cela s'est produit derrière la scène.
Par exemple,
val dataclass = DataClass(p1 = 1, p2 = 2)
val dataclassAsMap = objectMapper.convertValue(dataclass, object:
TypeReference<Map<String, Any>>() {})
//expect dataclassAsMap == mapOf("p1" to 1, "p2" to 2)
J'utilisais la méthode jackson, mais il s'avère que les performances sont terribles sur Android pour la première sérialisation ( problème github ici ). Et c'est dramatiquement pire pour les anciens = Android, ( voir les références ici )
Mais vous pouvez le faire beaucoup plus rapidement avec Gson. Conversion dans les deux directions indiquée ici:
val gson = Gson()
//convert a data class to a map
fun <T> T.serializeToMap(): Map<String, Any> {
return convert()
}
//convert a map to a data class
inline fun <reified T> Map<String, Any>.toDataClass(): T {
return convert()
}
//convert an object of type I to type O
inline fun <I, reified O> I.convert(): O {
val json = gson.toJson(this)
return gson.fromJson(json, object : TypeToken<O>() {}.type)
}
Le plus proche que vous pouvez obtenir est avec propriétés déléguées stockées dans une carte .
Exemple (à partir du lien):
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
Cependant, son utilisation avec des classes de données peut ne pas fonctionner très bien.