Externalizable提供完全手动控制的序列化,需实现writeExternal和readExternal方法并提供public无参构造器;不自动保存任何字段,读写顺序与类型必须严格一致,适用于需精细控制格式、压缩加密或跨语言兼容的场景。

Externalizable 提供了比 Serializable 高得多的手动控制自由度,核心在于“谁来决定序列化什么、怎么序列化、何时序列化”。
Serializable:自动但受限的序列化
它不提供任何方法,只是一个标记。JVM 会自动递归地把所有非 transient、非静态字段写入流,包括父类字段(只要父类也实现了 Serializable)。你只能通过 transient 关键字排除个别字段,或用 serialVersionUID 管理版本兼容性。无法跳过某个字段的序列化逻辑、无法压缩/加密字段值、无法按需计算并写入派生数据——这些都超出了它的能力范围。
Externalizable:完全由你掌控序列化流程
它强制你实现 writeExternal() 和 readExternal() 两个方法,意味着整个序列化过程从头到尾由你编码定义:
- 可以只序列化部分字段,甚至不序列化任何原始字段,只写入计算结果或摘要
- 能对字段做预处理,比如 Base64 编码、AES 加密、字符串反转、数值缩放等
- 可灵活处理继承关系:选择是否调用 super.writeExternal(),从而决定父类状态是否参与序列化
- 支持自定义协议结构,例如先写长度、再写类型标识、最后写内容,便于跨语言解析
- 能主动跳过 null 引用、避免序列化冗余对象图,显著减小序列化体积
一个关键约束:Externalizable 要求无参构造器
反序列化时,JVM 会先调用类的 public 无参构造器创建空对象,再调用 readExternal() 填充字段。这意味着你不能依赖有参构造器完成初始化逻辑——所有状态重建必须在 readExternal() 中显式完成。而 Serializable 不调用任何构造器,直接分配内存并设置字段值,这点反而更“透明”。
自由度不等于推荐默认使用
高自由度带来高责任:你必须确保 writeExternal() 和 readExternal() 的字段顺序、类型、数量严格一致;版本升级时字段增删需手动适配;错误容易导致反序列化失败且难以调试。Serializable 虽然“傻瓜式”,但在多数业务场景中足够可靠、兼容性好、开发成本低。

















