1. Hessian 简介
Hessian 是一种由 Caucho 开发的二进制序列化协议,支持 Java 及多语言(如 Python、C++、.NET)。它设计目标是高效、跨语言、简单,广泛用于分布式 RPC、Dubbo、微服务等场景。
主要特点:
- 高性能:体积小,序列化/反序列化速度快;
- 跨语言:多语言实现;
- 无需注册类:无需像 Kryo 那样注册类;
- 兼容性好:支持复杂对象、集合、Map、循环引用等。
2. Hessian 安装与依赖
Java Maven 依赖:
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
Gradle:
implementation 'com.caucho:hessian:4.0.38'
3. Hessian 基本使用
3.1 序列化和反序列化
import com.caucho.hessian.io.HessianOutput;
import com.caucho.hessian.io.HessianInput;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
public class HessianDemo {
public static void main(String[] args) throws Exception {
User user = new User(1, "Tom");
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(bos);
ho.writeObject(user);
byte[] bytes = bos.toByteArray();
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
HessianInput hi = new HessianInput(bis);
User user2 = (User) hi.readObject();
System.out.println(user2);
}
}
注意: 被序列化的对象必须实现 Serializable 接口。
4. Hessian 支持的数据类型
- 基本类型:int, long, double, boolean, String, byte[]
- 集合类型:List, Set, Map
- 数组
- 自定义对象(JavaBean)
- 循环引用对象
5. Hessian 进阶配置
5.1 自定义序列化器(SerializerFactory)
可以自定义序列化策略:
import com.caucho.hessian.io.SerializerFactory;
HessianOutput ho = new HessianOutput(bos);
SerializerFactory factory = new SerializerFactory();
// 可以注册自定义序列化器
ho.setSerializerFactory(factory);
5.2 版本兼容
Hessian 对象序列化基于字段名,字段顺序无关。如果类结构变更(如新增字段),旧数据仍可反序列化,新字段将为默认值。
6. Hessian 在分布式框架中的应用
Hessian 是 Dubbo 默认的序列化协议之一,适合高性能 RPC 场景。Dubbo 配置示例:
<dubbo:protocol name="dubbo" serialization="hessian2" port="20880"/>
7. Hessian 与其他序列化方案对比
| 特性 | Hessian | Java原生序列化 | Kryo | Protobuf/Avro |
|---|---|---|---|---|
| 性能 | 高 | 低 | 极高 | 极高 |
| 体积 | 小 | 大 | 小 | 小 |
| 跨语言支持 | 好 | 差 | 差 | 非常好 |
| 配置复杂度 | 低 | 低 | 中 | 高 |
| 兼容性 | 字段名兼容 | 需一致 | 需注册 | schema兼容 |
| 面向场景 | RPC、微服务 | Java内部 | Java内部 | API、消息队列 |
8. 常见问题与解决方法
8.1 循环引用对象
Hessian 支持对象之间的循环引用,自动处理。
8.2 字段丢失或类型不匹配
- 新增字段不会影响旧数据反序列化;
- 删除字段后,旧数据会丢失该字段。
8.3 性能调优
- 尽量避免大对象频繁序列化;
- 复用 HessianInput/Output 对象;
- 使用 ByteArrayOutputStream/ByteArrayInputStream 提升内存操作效率。
8.4 线程安全
HessianInput/HessianOutput 不是线程安全,每次序列化/反序列化都应新建实例。
9. Hessian 与 Spring 集成
Spring 提供 Hessian 服务端和客户端支持:
<bean id="hessianServiceExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="userService"/>
<property name="serviceInterface" value="com.example.UserService"/>
</bean>
10. 推荐实践
- 对象实现 Serializable
- 字段类型保持兼容,避免大幅变更
- 对于跨语言通信,保持字段命名一致
- 用单元测试验证序列化/反序列化兼容性
11. Hessian 进阶用法
11.1 序列化复杂对象结构
Hessian 支持嵌套对象、集合、Map、数组等复杂结构:
public class Group implements Serializable {
private List<User> members;
private Map<String, User> userMap;
// getters/setters
}
序列化/反序列化方法与普通对象一致,无需特别处理。
11.2 序列化枚举类型
Hessian 支持 Java 枚举类型,序列化时会写入枚举名称,反序列化时自动映射:
public enum Status { ACTIVE, INACTIVE }
public class User implements Serializable {
private Status status;
}
11.3 序列化多态对象
如果有多态字段(如父类引用子类对象),Hessian会自动写入实际类名,反序列化后恢复原类型。不过,所有相关类都要实现 Serializable。
12. Hessian 兼容性与版本升级实践
- 新增字段:只需在 JavaBean 中添加字段,旧数据反序列化时新字段为默认值。
- 删除字段:可直接删除,但旧数据的该字段会丢失。
- 字段类型变更:建议避免直接变更类型,必要时可用新字段替代旧字段。
- 字段重命名:不建议,因 Hessian 依赖字段名做序列化映射。
推荐做法:
- 用 transient 修饰不需要序列化的字段;
- 保持字段名和类型稳定;
- 用单元测试验证新旧版本兼容性。
13. Hessian 在分布式系统中的应用实践
13.1 Dubbo Hessian2 配置
Dubbo 默认支持 Hessian2 序列化,配置方式如下:
<dubbo:protocol name="dubbo" serialization="hessian2" port="20880"/>
13.2 Spring Remoting Hessian
Spring Remoting 可用 Hessian 实现远程服务调用:
- 服务端用 HessianServiceExporter
- 客户端用 HessianProxyFactoryBean
参考 Spring 官方文档:Spring Hessian
14. Hessian 跨语言互操作
Hessian 有多语言实现(如 Python、C++、.NET)。要实现跨语言互操作:
- 保证字段名、类型一致
- 避免 Java 特有类型(如泛型、复杂继承结构)
- 推荐使用基础类型、数组、Map、List、简单对象
Python Hessian 实现:
15. 常见陷阱与调试技巧
15.1 非 Serializable 报错
所有被序列化的对象都必须实现 Serializable 接口,否则会抛出异常。
15.2 字段丢失/类型不兼容
升级时字段名或类型变更,可能导致反序列化异常。建议升级前后做回归测试。
15.3 HessianInput/HessianOutput 线程安全
它们不是线程安全,每次序列化/反序列化都应新建实例。
15.4 性能调试
- 用
System.nanoTime()计时序列化/反序列化过程 - 用
byte[].length查看序列化体积 - 用 JMH 做性能基准测试
16. Hessian 与其他序列化方案选择建议
- Hessian:跨语言、微服务、RPC、Dubbo推荐
- Kryo:Java内部高性能
- Protobuf/Avro:强类型、跨语言、API/消息队列
- Java原生:仅限简单场景
17. Hessian 工具类示例
public class HessianUtils {
public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(bos);
ho.writeObject(obj);
return bos.toByteArray();
}
public static <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
HessianInput hi = new HessianInput(bis);
return (T) hi.readObject();
}
}
1278

被折叠的 条评论
为什么被折叠?



