我有一个Kotlin对象,需要将其转换为字节数组(byte[]
)。我了解如何将String和一系列其他类型的变量转换为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)
}
以下是对象可序列化的类,该类有助于在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
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句