序列化性能可以从对象模型、序列化协议、序列化过程、系统架构等多方面优化,下面按实战优先级给你一个系统性的提升思路(附常见框架和案例)。
| 协议 | 性能 | 可读性 | 适合场景 |
|---|---|---|---|
| Protobuf | ⭐⭐⭐⭐⭐ | 差 | RPC、跨语言 |
| FlatBuffers | ⭐⭐⭐⭐⭐ | 差 | 零拷贝、实时系统 |
| Kryo | ⭐⭐⭐⭐ | 差 | JVM 内部 |
| Hessian | ⭐⭐⭐ | 一般 | Java RPC |
| JSON (Jackson) | ⭐⭐ | 好 | 对外接口 |
| Java 原生 | ⭐ | 中 | 强烈不推荐 |
✅ 经验结论:
❌ 避免:
class User {
String name;
Integer age;
Date createTime;
BigDecimal balance;
Map<String, Object> ext;
}
✅ 优化:
int > Integer)long 时间戳代替 Dateint/long 表示枚举✅ Protobuf 天然支持
✅ Jackson 可开启:
objectMapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, false);
❌ 错误示例:
for (User u : list) {
serialize(u);
}
✅ 正确:
serialize(list);
适合:
byte[] cached = serialize(config);
❌ 每次 new:
ObjectMapper mapper = new ObjectMapper();
✅ 复用:
private static final ObjectMapper MAPPER = new ObjectMapper();
Kryo 示例:
Kryo kryo = kryoThreadLocal.get();
| 框架 | 反射 | 优化方式 |
|---|---|---|
| Java 原生 | 多 | ❌ |
| Jackson | 有 | 开启 Afterburner |
| Kryo | 少 | 注册类 |
| Protobuf | 无 | ✅ |
✅ Jackson 加速:
mapper.registerModule(new AfterburnerModule());
✅ Kryo 注册类:
kryo.register(User.class, 1);
适合高性能场景:
ByteBuffer → Channel → 网络
-XX:+UseCompressedOops
-XX:+DisableExplicitGC
| 方式 | 序列化速度 | 大小 |
|---|---|---|
| Java Serializable | 1x | 大 |
| Jackson JSON | 3x | 中 |
| Kryo | 10x | 小 |
| Protobuf | 12x | 小 |
| FlatBuffers | 15x | 最小 |
Kryo + 类注册 + 对象复用
Protobuf + gRPC
FlatBuffers + 直接内存
如果你愿意,可以告诉我:
我可以直接给你针对性的优化方案和示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。