fst可直接替换jdk序列化,提速3–10倍、压缩20–40%,关键在于复用fstconfiguration单例、优先使用字节数组api、正确管理流资源,并通过类白名单和forceserializable提升安全性。

直接用 FST 替换 JDK 原生序列化,无需改业务类,就能实现 3–10 倍的序列化提速和 20–40% 的体积压缩。关键不在“怎么写”,而在“怎么配”和“怎么复用”。
复用 FSTConfiguration 实例
FST 的性能优势高度依赖配置对象的复用。每次新建 FSTConfiguration 都会重新扫描类结构、构建缓存,开销极大。
- 全局静态单例创建:用
FSTConfiguration.createDefaultConfiguration()初始化一次,长期持有 - 避免在方法内 new Configuration:尤其不能在高并发序列化入口(如 RPC 处理器、缓存写入)中重复创建
- Android 环境选
createAndroidDefaultConfiguration(),它禁用反射优化以适配 Dalvik/ART
优先使用字节数组快捷 API
对中小对象(如 DTO、VO),跳过流操作,直接走内存级序列化,减少 I/O 层开销和对象包装。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 序列化:
byte[] bytes = conf.asByteArray(obj) - 反序列化:
MyClass obj = (MyClass) conf.asObject(bytes) - 该方式自动处理类型信息,无需手动传 Class 参数,适合缓存、本地存储等场景
流式序列化时注意资源管理
使用 FSTObjectOutput / FSTObjectInput 时,不能调用其 close() —— 它由 FSTConfiguration 管理生命周期。
- 正确做法:只关闭底层
InputStream或OutputStream,例如stream.close() - 错误写法:
out.close()或in.close()会导致缓存失效、线程不安全甚至 NPE - 务必调用
out.flush()确保数据写出,尤其在非阻塞或缓冲流场景下
兼容性与安全增强配置
FST 默认 99% 兼容 JDK 序列化,但生产环境需主动加固。
- 开启类白名单:
conf.registerClass(MyClass.class),禁止未注册类反序列化,防漏洞利用 - 禁用动态类加载:
conf.setForceSerializable(true),强制只序列化实现Serializable的类 - 如需跨语言交互,启用 MinBin 格式:
conf.setPreferMinBin(true),生成更紧凑、可被 Go/Python 解析的二进制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










