Java原生序列化严禁用于企业级开发,因其存在五大致命短板:1.跨语言不支持;2.二进制流不可读、调试困难;3.反序列化触发恶意代码执行,安全风险极高;4.序列化体积大、性能差;5.强依赖JVM和serialVersionUID,兼容性脆弱。
java原生序列化(serializable)在跨进程、跨网络或跨语言场景下,不建议作为变量传输方案。它既慢、又不安全、还难兼容;而json和protobuf才是面向现代分布式系统的真实选择——前者胜在人可读、开发快,后者赢在体积小、解析快、类型稳。
原生序列化:只适合单JVM内短生命周期缓存
Java Serializable 是 JVM 私有机制,不是通信协议:
- 反序列化需反射遍历字段、加载类、重建对象图,比 Protobuf 慢 3–5 倍,GC 压力大
- 依赖
serialVersionUID,Java 8 和 Java 17 之间稍有改动就失败 - 反序列化会执行任意构造逻辑和
readObject(),Log4j2 等高危漏洞均源于此 - Python、Go、JavaScript 完全无法识别其字节流,跨语言为零支持
JSON:前端友好、调试直观,但带宽和CPU不友好
文本格式决定了它的天然边界:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 字段名重复出现(如
"name"、"age"),相同结构数据体积通常是 Protobuf 的 3–5 倍 - 需逐字符解析、字符串匹配、动态建 Map/Bean,CPU 消耗高,吞吐量受限
- 无 schema 校验,字段拼错、类型错位只能靠运行时抛异常
- 浏览器直通、REST API 默认载体、Spring Boot 开箱即用,适合管理后台、配置下发、开放接口
Protobuf:高性能 RPC 的工业标准
二进制 + 编号驱动 + 预编译,是它高效的核心:
- 字段用数字编号(
name = 1)代替字符串键名,省去文本解析与哈希计算 - Varint 编码让小整数只占 1 字节,ZigZag 处理负数,压缩率远超 JSON
- proto 文件定义契约,生成强类型代码,编译期捕获字段缺失、类型错误
- 新增字段不影响旧客户端(只要编号不冲突),天然支持前后兼容
- gRPC 默认绑定 Protobuf,Netty、Dubbo 3+ 均深度集成,适合微服务内部高频调用
选型一句话决策树
传给浏览器或第三方系统?→ 选 JSON
Java 微服务间高频 RPC?→ 选 Protobuf
同一 JVM 内临时缓存对象?→ 可谨慎用 Serializable(但优先考虑 LRUMap 或 off-heap)
需要动态结构、字段随时增减?→ JSON 或 MessagePack 更合适


















