1
votes

Comment convertir une classe de données en ByteBuffer dans Kotlin?

J'essaye d'utiliser Kinesis, qui attend des données au format byte buffer. Tous les exemples que j'ai vus jusqu'à présent sont en Java et transmettent des chaînes simples. Quelqu'un peut-il donner une idée de la façon de convertir une classe de données kotlin en bytebuffer?

par exemple classe de données abc ( var a: Long, var b: chaîne, var c: Double )


0 commentaires

3 Réponses :


3
votes

Vérifiez la méthode ci-dessous

  val byteBuffer = ByteBuffer.wrap(byteArray)
        byteBuffer.get(Int) //Int variable
        byteBuffer.get(Double) //Double variable
        byteBuffer.get(nonce)

Vous pouvez allouer la taille en fonction de la taille des types de données comme Int 4 octets, Double et Long 8 octets

pour la relecture de dataType

fun toByteArray(): ByteArray? {
val size: Int = 8 + 8 + string.Size

val byteBuffer = ByteBuffer.allocate(size)
        .put(long) //long veriable 
        .put(double) // double veriable 
        .put(string)


   return byteBuffer.array()
}


0 commentaires

2
votes

Vous voudrez peut-être jeter un œil à kotlinx.serialization . Il s'agit d'un projet Kotlin officiel et prend en charge plusieurs formats de prêt à l'emploi. Vous pouvez utiliser la sortie et l'envelopper avec ByteBuffer.wrap


1 commentaires

Je l'ai essayé, j'ai obtenu une erreur sur la sérialisation de LocalDateTime.



0
votes

Merci pour toutes les suggestions.

Résolution du problème en utilisant ObjectMapper () de la bibliothèque Jackson (jackson-databind) et des annotations. Code suivant utilisé pour la sérialisation:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
var edd: LocalDateTime?,

code pour la désérialisation:

val objectMapper = ObjectMapper()
objectMapper.registerModule(JavaTimeModule())
val obj = objectMapper.readValue(Charsets.UTF_8.decode(record.data()).toString(), ClassName::class.java)

En dehors de cela, j'ai dû ajouter des constructeurs de toutes les classes de données et a dû ajouter l'annotation suivante à tous les attributs LocalDateTime:

val objectMapper = ObjectMapper()
objectMapper.registerModule(JavaTimeModule())
val buf = ByteBuffer.wrap(objectMapper.writeValueAsString(className).toByteArray(Charsets.UTF_8))


0 commentaires