如何在Kotlin中将数据类转换为ByteBuffer?

xuo3flqw  于 2023-01-26  发布在  Kotlin
关注(0)|答案(4)|浏览(216)

我正在尝试使用Kinesis,它需要字节缓冲区格式的数据。到目前为止,我所看到的所有示例都是用Java编写的,并传递简单的字符串。有人能告诉我如何将kotlin数据类转换为字节缓冲区吗?
例如数据类ABC(变量A:长型,变量b:字符串,变量c:双人间)

iyr7buue

iyr7buue1#

检查以下方法

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()
}

您可以根据dataType大小分配大小,如Int 4字节、Double和Long 8字节
用于阅读回dataType

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

ee7vknir2#

您可能想看一下kotlinx.serialization,它是一个官方的Kotlin项目,支持多种现成的格式,您可以使用输出并将其 Package 在ByteBuffer.wrap

nc1teljy

nc1teljy3#

谢谢你的建议。
使用Jackson库(jackson-databind)的ObjectMapper()和注解解决了此问题。以下代码用于序列化:

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

反序列化代码:

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

除此之外,我还必须添加所有数据类的构造函数,并且必须向所有LocalDateTime属性添加以下注解:

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

3df52oht4#

简单的解决方案,无需额外的库
注意:必须针对每个数据类进行定制

data class TimerConfig(val startTime: Long, val repeatCount: Int, val sequenceDuration: Int)

将数据类转换为ByteArray

private fun TimerConfig.toByteArray(): ByteArray {
    val byteBuffer = ByteBuffer.allocate(Long.SIZE_BYTES + Int.SIZE_BYTES + Int.SIZE_BYTES)
    byteBuffer.putLong(this.startTime)
    byteBuffer.putInt(this.repeatCount)
    byteBuffer.putInt(this.sequenceDuration)
    return byteBuffer.array()
}

从接收到的ByteArray中恢复数据类

private fun ByteArray.toTimerConfig(): TimerConfig {
    val byteBuffer = ByteBuffer.wrap(this)
    return TimerConfig(byteBuffer.long, byteBuffer.int, byteBuffer.int)
}

相关问题