hessian2 协议通过紧凑二进制编码、类型复用与去冗余设计显著压缩报文体积:使用 1–2 字节 type tag、变长整数、字段隐式索引、8 字节时间戳、null 专用标记及无版本头等机制,使相同 pojo 序列化体积较 json 降低约 40%–60%。

用 Hessian2 协议替代 Java 原生序列化或 JSON,能显著压缩报文体积,核心在于它用紧凑二进制编码替代了冗余文本或低效对象描述。关键不在于“加功能”,而在于“去冗余”和“类型复用”。
二进制编码直接省掉文本解析开销
Hessian2 把每个数据类型映射为 1–2 字节的 type tag(如 0x53 表示字符串,0x49 表示 int),后面紧接原始字节。对比 JSON 的 "name":"zhangsan"(含引号、冒号、逗号、字段名),Hessian2 只存 0x53 + 长度 + zhangsan 字节流。没有重复字段名、无空白符、无类型描述字符串。
- 一个含 5 个 String 字段 + 2 个 int 的 POJO,JSON 编码通常超 200 字节;Hessian2 一般控制在 80–120 字节内
- 传输二进制 blob(如图片 base64)时,Hessian2 直接写入原始字节,JSON 则需 base64 编码再转义,体积膨胀约 33%
变长整数与字段复用机制降低结构开销
Hessian2 对整数采用变长编码(类似 Protocol Buffers):小数值(如 0–127)只占 1 字节;大数值才逐步扩展。对象字段不重复发送名称,而是按定义顺序隐式索引;若多个对象结构相同(如订单列表),后续对象可省略字段名,只传值。
- 例如连续 10 个
Order(id: long, amount: double),第一个完整编码字段名,后 9 个只传id和amount的二进制值 - 日期类型不存字符串格式(如 "2026-07-28T16:48:00"),而是序列化为 64 位毫秒时间戳,仅占 8 字节
深度适配 Java 类型系统,避免运行时反射推断
Hessian2 在编解码时依赖接口定义或类元信息,提前知道字段类型和顺序,无需像 JSON 那样靠字段名动态匹配、反复反射查找 setter。这不仅提速,也减少中间对象(如 Map、JsonNode)生成,间接降低序列化后 payload 中的“元数据膨胀”。
- 泛型信息(如
List<user></user>)被保留并用于生成更精确的二进制结构,避免 JSON 中常见的[{...},{...}]全量重复 - 对 null 值有专用标记(0x4e),不占字段名也不占空字符串,比 JSON 的
"field":null节省至少 10 字节/字段
禁用不必要的类型描述和版本头
默认 Hessian2 不带协议版本号或 schema 描述头。相比 Protobuf 需要 .proto 文件预编译、gRPC 携带 HTTP/2 header,Hessian2 请求体就是纯数据流——HTTP body 内容即有效载荷,无额外封装层。
- 启用
Hessian2Output.setSerializerFactory(...)可关闭对非标准类型的 fallback 处理,进一步收紧输出 - 服务端使用
HessianServlet时,确保未开启调试模式(debug=true),否则可能插入 human-readable 注释字节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











