原始类型在二进制序列化中压缩率高,是因为零冗余表达:不转文本、变长编码、隐式类型标识。如整数42,json需2字节字符串"42",messagepack仅1字节0x2a;实际对象json占42字节,messagepack仅12–15字节。

原始类型在二进制序列化中压缩率高,不是因为“被压缩”了,而是因为根本不需要冗余编码——它直接用最紧凑的字节表示数值本身。
比如一个整数 42:
- JSON 会写成字符串
"42"(两个 ASCII 字符,2 字节),还要加引号、逗号、字段名等; - MessagePack 则用单个字节
0x2a(即十进制 42 的无符号 8 位整数编码)就搞定。
这种优势来自三个层面:
无文本解析开销
原始类型不转成字符再转回数字。int32直接存为 4 个字节小端/大端二进制,跳过 ASCII 解析、进制转换、缓冲区拼接等步骤。变长整数编码(如 VInt)智能省空间
小数字用 1 字节,大数字才逐步扩展。MessagePack 对0–127用 1 字节(0x00–0x7f),128–32767用 2 字节(0xcc前缀 + 2 字节),避免固定 4 或 8 字节浪费。类型信息隐式携带,无需额外标记
JSON 必须靠字段名和结构推断类型("count": 5中5是数字还是字符串?靠语法猜);MessagePack 每个值自带类型标识(如0x05就是正整数 5),反序列化时不用解析上下文,也不存字段名重复开销。
实际对比一个简单对象:
{"id": 1001, "active": true, "score": 95.5}
JSON 占约 42 字节(含空格、引号、冒号);
MessagePack 编码后通常仅 12–15 字节——其中 1001 占 2 字节,true 占 1 字节,95.5(float32)占 4 字节,加上 map 长度和键的紧凑编码。
所以原始类型的“高压缩率”,本质是零冗余表达。它不依赖哈夫曼或 LZ77 这类通用压缩算法,而是在协议设计之初就剔除了人类可读性带来的所有字节税。










