You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:29:52