Kotlin序列化:如何原样保留ByteArray二进制数据
解决思路:JSON无法直接嵌入二进制,换用二进制序列化格式
首先明确:JSON是纯文本格式,天生不支持直接嵌入原始二进制数据——所有非文本内容都必须转成字符串表示(比如你现在遇到的字节数组字符串,或者Base64),这是JSON的规范限制,没法绕过。
如果不想用Base64,也不想让字节数组变成冗余的字符串,最直接的方案是放弃JSON,改用支持二进制序列化的格式,下面是两种常用方案:
1. Kotlin 内置二进制序列化
Kotlinx Serialization 自带二进制序列化器,能直接把对象序列化为二进制字节流,完全保留ByteArray的原始数据:
实现步骤:
- 确保项目引入
kotlinx-serialization-core和kotlinx-serialization-binary依赖 - 给
Test类加上@Serializable注解 - 使用
BinaryFormat完成序列化/反序列化
示例代码:
import kotlinx.serialization.Serializable import kotlinx.serialization.binary.DefaultBinaryFormat @Serializable data class Test(val name: String, val data: ByteArray) fun main() { val testObj = Test("demo", byteArrayOf(0x01, 0x02, 0x03, 0x04)) // 序列化为二进制字节数组 val binaryBytes = DefaultBinaryFormat.encodeToByteArray(Test.serializer(), testObj) // 反序列化回对象 val restoredObj = DefaultBinaryFormat.decodeFromByteArray(Test.serializer(), binaryBytes) }
这种方式下,data字段的4字节数据会原样保留在结果里,没有额外体积开销。
2. 用Protocol Buffers(Protobuf)
Protobuf是Google推出的高效二进制序列化格式,对字节数组的支持非常友好,序列化后的体积极小:
实现步骤:
- 先写
.proto文件定义Test结构:
syntax = "proto3"; message Test { string name = 1; bytes data = 2; }
- 通过
protoc工具生成Kotlin(或Java)代码 - 用生成的代码做序列化/反序列化
这种方案不仅能保留原始二进制数据,还能获得比JSON高得多的序列化效率和更小的输出体积。
为啥JSON做不到?
JSON的语法只允许字符串、数字、布尔值、数组、对象、null这几种类型,没有二进制类型的定义。任何二进制数据要放进JSON,都必须转成字符串——要么是[1,2,3,4]这种数组字符串,要么是Base64编码后的字符串,两者都会增加数据体积,这是JSON的本质限制,没有办法直接嵌入原始二进制。
内容的提问来源于stack exchange,提问作者kristyna
相关产品推荐
相关产品推荐

