【问题标题】:How to convert an Object into a byte array in Kotlin如何在 Kotlin 中将对象转换为字节数组
【发布时间】:2020-11-16 12:59:17
【问题描述】:

我有一个 Kotlin 对象,需要将其转换为字节数组 (byte[])。我了解如何将字符串和一系列其他类型的变量转换为byte[],但我找不到任何关于使用对象执行此操作的内容。

这是我尝试过的:

override fun activateQuestion(instructorUserName: String, host: String, port: Int, questionToActivate: MultipleChoiceQuestion) {
        val socket = DatagramSocket()

        //This is the problem -- `.toByteArray(...)` only works for Strings
        val questionToActivateAsByteArray = questionToActivate.toByteArray(Charsets.UTF_8)

        //send byte[] data 
        val packet = DatagramPacket(questionToActivateAsByteArray, questionToActivateAsByteArray.size, InetAddress.getByName(host), port)
        socket.send(packet)
    }

【问题讨论】:

  • 在通过网络发送对象时,我通常选择使用 json。它允许您以任何语言解码它们。我会使用 Jackson ObjectMapper 并将您的对象转换为字符串,然后再将其作为字节发送。
  • 您找到解决方案了吗?我也想知道。

标签: arrays sockets kotlin


【解决方案1】:

你可以转换成java风格的bytearray。像这样:Java Serializable Object to Byte Array

编辑: 为了使它更容易,它的实用函数看起来像这样:

import java.io.*

@Suppress("UNCHECKED_CAST")
fun <T : Serializable> fromByteArray(byteArray: ByteArray): T {
    val byteArrayInputStream = ByteArrayInputStream(byteArray)
    val objectInput: ObjectInput
    objectInput = ObjectInputStream(byteArrayInputStream)
    val result = objectInput.readObject() as T
    objectInput.close()
    byteArrayInputStream.close()
    return result
}

fun Serializable.toByteArray(): ByteArray {
    val byteArrayOutputStream = ByteArrayOutputStream()
    val objectOutputStream: ObjectOutputStream
    objectOutputStream = ObjectOutputStream(byteArrayOutputStream)
    objectOutputStream.writeObject(this)
    objectOutputStream.flush()
    val result = byteArrayOutputStream.toByteArray()
    byteArrayOutputStream.close()
    objectOutputStream.close()
    return result
}

使用它们只是做类似的事情:

val yourSerializableObject = YourSerializableObject(...)
val objectInByteArrayFormat = yourSerializableObject.toByteArray()
val convertedObject = fromByteArray<YourSerializableObject>(objectInByteArrayFormat)

不要忘记您的对象及其所有属性都必须是可序列化的

【讨论】:

    【解决方案2】:

    以下是一个对象可序列化类,它有助于在 Kotlin 中将对象转换为字节数组,反之亦然。

    public class ObjectSerializer {
        companion object {
            public fun serialize(obj: Any?) : String {
                if (obj == null) {
                    return ""
                }
    
                var baos = ByteArrayOutputStream()
                var oos = ObjectOutputStream(baos)
                oos.writeObject(obj)
                oos.close()
    
                return encodeBytes(baos.toByteArray())
            }
    
            public fun deserialize(str: String?) : Any? {
                if (str == null || str.length() == 0) {
                    return null
                }
    
                var bais = ByteArrayInputStream(decodeBytes(str))
                var ois = ObjectInputStream(bais)
    
                return ois.readObject()
            }
    
            private fun encodeBytes(bytes: ByteArray) : String {
                var buffer = StringBuffer()
    
                for (byte in bytes) {
                    buffer.append(((byte.toInt() shr 4) and 0xF plus 'a').toChar())
                    buffer.append(((byte.toInt()) and 0xF plus 'a').toChar())
                }
    
                return buffer.toString()
            }
    
            private fun decodeBytes(str: String) : ByteArray {
                var bytes = ByteArray(str.length() / 2)
    
                for (i in 0..(str.length() - 1)) {
                    var c = str.charAt(i)
                    bytes.set(i / 2, ((c minus 'a').toInt() shl 4).toByte())
    
                    c = str.charAt(i + 1)
                    bytes.set(i / 2, (bytes.get(i / 2) + (c minus 'a')).toByte())
                }
    
                return bytes
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2018-09-08
      • 2021-11-30
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多