Как преобразовать класс данных в ByteBuffer в Котлине?

Я пытаюсь использовать Kinesis, который ожидает данные в формате байтового буфера. Все примеры, которые я видел до сих пор, написаны на Java и передают простые строки. Может ли кто-нибудь дать представление о том, как преобразовать класс данных kotlin в байтовый буфер?

например класс данных abc (var a: Long, var b: String, var c: Double)


person N. S. Mehra    schedule 07.02.2019    source источник


Ответы (3)


Проверьте метод ниже

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)
person Jarvis    schedule 07.02.2019

Вы можете взглянуть на kotlinx.serialization. Это официальный проект Kotlin, который поддерживает несколько форматов . из коробки. Вы можете использовать вывод и обернуть его с помощью ByteBuffer.wrap

person Benni    schedule 07.02.2019
comment
Пробовал, получил ошибку при сериализации LocalDateTime. - person N. S. Mehra; 08.02.2019

Спасибо за все предложения.

Проблема решена с помощью ObjectMapper() библиотеки Jackson (jackson-databind) и аннотаций. Следующий код, используемый для сериализации:

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?,
person N. S. Mehra    schedule 14.02.2019