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

Posted

技术标签:

【中文标题】如何在 Kotlin 中将数据类转换为 ByteBuffer?【英文标题】:How to convert a Data Class to ByteBuffer in Kotlin? 【发布时间】:2019-02-07 07:17:42 【问题描述】:

我正在尝试使用 Kinesis,它需要字节缓冲区格式的数据。到目前为止,我看到的所有示例都是用 Java 编写的,并且传递简单的字符串。 谁能给出如何将 kotlin 数据类转换为字节缓冲区的想法?

例如 数据类 abc ( var a:长, 变量 b:字符串, var c:双倍 )

【问题讨论】:

【参考方案1】:

检查以下方法

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

您可以根据数据类型大小分配大小,例如 Int 4 字节、Double 和 Long 8 字节

用于回读数据类型

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

【讨论】:

【参考方案2】:

您可能想看看kotlinx.serialization。它是一个官方的 Kotlin 项目,支持多个开箱即用的 formats。您可以使用输出并将其包装在ByteBuffer.wrap

【讨论】:

试过了,LocalDateTime 序列化出错。【参考方案3】:

感谢所有建议。

使用 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?,

【讨论】:

最简单的解决方案

以上是关于如何在 Kotlin 中将数据类转换为 ByteBuffer?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中将 Firestore 日期/时间戳转换为日期?

如何在 Kotlin 中将 String 转换为 Int?

如何在 Kotlin 中将 ArrayList 转换为 JSONArray()

如何在 Kotlin 中将字符串数组 JSON 转换为 ArrayList?

如何在 Kotlin 中将 View 转换为 Imageview [重复]

如何在 Kotlin 中将 listView 转换为 RecyclerView