Hessian 序列化解析
一、Hessian 概述
Hessian 是由 Caucho 公司开发的二进制 RPC 协议与序列化框架,支持 Java、.NET、Python 等多种语言,具有跨平台通信能力。其核心优势体现在性能、体积和跨语言兼容性上,适用于微服务通信、分布式系统等场景。
二、核心特性
✅ 高效轻量
- 体积小:相比 JDK 序列化,Hessian 数据体积减少 30%~50%
- 速度快:反序列化速度优于 JSON(如 FastJSON)
✅ 复杂类型支持
- 基本类型、集合、Map、枚举、BigDecimal
- 循环引用处理能力
- 子类 / 父类同名字段优先处理子类字段
✅ 跨语言兼容
- 支持异构系统通信(Java ↔ Python ↔ .NET)
三、性能对比
特性 | JDK 序列化 | FastJSON | Hessian |
---|---|---|---|
序列化体积 | 最大 | 最小 | 适中 |
序列化耗时 | 快 | 慢 | 较快 |
反序列化耗时 | 较慢 | 一般 | 最快 |
多语言支持 | 否 | 否 | 是 |
安全性 | 高 | 存在注入风险 | 高 |
实验数据:
- JDK 序列化长度:626 字节,耗时:55ms
- Hessian 序列化长度:182 字节,耗时:56ms
- FastJSON 序列化长度:119 字节,耗时:225ms
四、代码示例
public class HessianSerializer implements Serializer {
@Override
public byte[] serialize(Object object) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
HessianOutput output = new HessianOutput(byteArrayOutputStream);
output.writeObject(object);
output.flush();
return byteArrayOutputStream.toByteArray();} catch (IOException e) {
throw new SerializeException("Hessian 序列化失败", e);}
}
@Override
public Object deserialize(byte[] bytes, int messageType) throws ClassNotFoundException {
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)) {
HessianInput input = new HessianInput(byteArrayInputStream);
return input.readObject();} catch (IOException e) {
throw new SerializeException("Hessian 反序列化失败", e);}
}
}
五、序列化原理
1. 数据结构
C
标识类定义开始- 类名长度 + 类名
- 属性数量 + 属性名长度 + 属性名
- 实例化标识 + 属性值(递归处理嵌套对象)
2. 反序列化流程
- 读取类定义(
C
标识) - 加载类并创建反序列化器
- 生成字段映射表
_fieldMap
- 匹配字段并赋值(忽略不存在字段)
六、常见问题与解决方案
- 枚举新增字段是否影响反序列化?
- 不会影响。Hessian 序列化的是枚举的名称(name)。只要反序列化端存在同名的枚举常量,即可正常反序列化
- 子类与父类有同名字段,能否正常赋值?
- 可以正常赋值。Hessian 会优先处理子类字段,父类同名字段将被忽略
- 序列化类增加字段,反序列化类未更新,能否正常运行?
- 可以正常运行。Hessian 会忽略反序列化类中没有的字段
- 使用基本类型还是包装器类型更好?
- 建议使用包装器类型(Integer/Double)。基本类型在反序列化时无法表示 null 值,可能导致逻辑错误
七、最佳实践
- ❗ 枚举处理
- 新增枚举常量不影响反序列化
- 建议使用
name()
保持兼容性
- ❗ 字段变更
- 新增字段:反序列化端可忽略
- 删除字段:不影响旧数据
- ❗ 类型选择
- 优先使用包装器类型(Integer/Double)
- 避免基本类型导致的 null 值丢失
八、适用场景
场景 | 适用性 | 说明 |
---|---|---|
微服务 RPC 通信 | ✅ | 低延迟、高吞吐 |
分布式缓存 | ✅ | 体积小节省存储空间 |
跨语言系统集成 | ✅ | 协议兼容性优势 |
嵌套对象结构传输 | ✅ | 支持复杂数据结构 |
九、总结
Hessian 凭借其高效的二进制序列化机制、跨语言兼容性和稳定性,成为分布式系统通信的优选方案。结合现代文档工具链(如 MarkItDown、Pandoc),可实现代码与文档的自动化协同管理。对于追求性能与安全的后端服务,Hessian 是值得长期投入的技术选型。
License:
CC BY 4.0