Externalizable 接口要求类显式实现并提供无参构造器,完全自主控制序列化字段的读写顺序与内容,不自动处理任何字段,且读写顺序和类型必须严格一致。

Java 中通过 Externalizable 接口实现自定义序列化,本质是**放弃 JVM 默认机制,由你全权控制字节流的读写细节**。它不是 Serializable 的增强版,而是一条更底层、更精确、也更需谨慎的路径。
必须满足的三个硬性条件
缺一不可,否则运行时直接报错(如 InvalidClassException 或 NoSuchMethodException):
- 类显式声明
implements Externalizable - 提供 public 无参构造器——反序列化时 JVM 会先调用它创建空对象,再进
readExternal - 重写
writeExternal(ObjectOutput out)和readExternal(ObjectInput in)两个方法
字段控制完全由你决定
Externalizable 不会自动处理任何字段:public、private、transient、static、父类字段……统统不参与,除非你在两个方法里显式操作。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
writeExternal中,只调用out.writeXXX()写你需要保存的字段,比如:out.writeUTF(name); out.writeInt(id); out.writeBoolean(active); - 跳过计算字段(
getFullName())、缓存字段(cacheMap)、临时状态(isProcessing)、敏感数据(passwordHash)——不写,就彻底不出现在字节流里 - 可主动加入轻量元信息,例如开头写版本号:
out.writeInt(2);,为后续兼容升级留空间
读写顺序与类型必须严格一致
这是 Externalizable 最关键也最容易出错的约束。读和写的逻辑必须像镜像一样对齐。
立即学习“Java免费学习笔记(深入)”;
- 如果
writeExternal先写 int、再写 String、最后写 boolean,那么readExternal就必须按相同顺序、相同类型读:id = in.readInt(); name = in.readUTF(); active = in.readBoolean(); - 顺序错一位、类型混一次(比如该读 int 却调用
readUTF()),就会抛StreamCorruptedException或类型转换异常 - 有版本号时,先读版本:
int version = in.readInt();,再根据version分支处理字段(如旧版本不读新增字段,新版本跳过已废弃字段)
与父类或引用类型的协作
若类有父类且父类也实现了 Externalizable:
- 子类
writeExternal中需显式调用super.writeExternal(out) - 子类
readExternal中同样需显式调用super.readExternal(in) - 引用类型字段(如
List<String>)用out.writeObject()写,对应用in.readObject()读,但要确保其本身可序列化(或也实现 Externalizable)

















