文章

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. 反序列化流程

  1. 读取类定义(C 标识)
  2. 加载类并创建反序列化器
  3. 生成字段映射表 _fieldMap
  4. 匹配字段并赋值(忽略不存在字段)

六、常见问题与解决方案

  1. 枚举新增字段是否影响反序列化?
  • 不会影响。Hessian 序列化的是枚举的名称(name)。只要反序列化端存在同名的枚举常量,即可正常反序列化
  1. 子类与父类有同名字段,能否正常赋值?
  • 可以正常赋值。Hessian 会优先处理子类字段,父类同名字段将被忽略
  1. 序列化类增加字段,反序列化类未更新,能否正常运行?
  • 可以正常运行。Hessian 会忽略反序列化类中没有的字段
  1. 使用基本类型还是包装器类型更好?
  • 建议使用包装器类型(Integer/Double)。基本类型在反序列化时无法表示 null 值,可能导致逻辑错误

七、最佳实践

  1. ❗ 枚举处理
  • 新增枚举常量不影响反序列化
  • 建议使用 name() 保持兼容性
  1. ❗ 字段变更
  • 新增字段:反序列化端可忽略
  • 删除字段:不影响旧数据
  1. ❗ 类型选择
  • 优先使用包装器类型(Integer/Double)
  • 避免基本类型导致的 null 值丢失

八、适用场景

场景 适用性 说明
微服务 RPC 通信 低延迟、高吞吐
分布式缓存 体积小节省存储空间
跨语言系统集成 协议兼容性优势
嵌套对象结构传输 支持复杂数据结构

九、总结

Hessian 凭借其高效的二进制序列化机制、跨语言兼容性和稳定性,成为分布式系统通信的优选方案。结合现代文档工具链(如 MarkItDown、Pandoc),可实现代码与文档的自动化协同管理。对于追求性能与安全的后端服务,Hessian 是值得长期投入的技术选型。

参考实现
Hessian 官方文档
掘金 - Hessian 序列化分析

License:  CC BY 4.0