ObjectOutputStream / ObjectInputStream,直接讀寫 Java 對象java.io.Serializable 標記接口 (無方法)private static final long serialVersionUID = 1L; 避免版本不兼容導致 InvalidClassExceptiontransientExternalizable 接口 (完全控制)
public class MyData implements Externalizable {
private int id;
private String name;
@Override public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(id);
out.writeUTF(name);
}
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
id = in.readInt();
name = in.readUTF();
}
}
優點:自定義二進制格式、加密、壓縮、版本兼容邏輯。缺點:維護成本高,通常 Serializable 足夠。
class Student implements Serializable {
private static final long serialVersionUID = 1L;
int age = 25;
String name = "Bob";
transient String password = "secret"; // 不序列化
String school = "MIT";
}
public class ObjectStreamDemo {
public static void main(String[] args) throws Exception {
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.dat"))) {
oos.writeObject(new Student());
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.dat"))) {
Student s = (Student) ois.readObject();
System.out.println(s.age + " " + s.name + " " + s.password + " " + s.school);
// 輸出: 25 Bob null MIT
}
}
}
Serializable 但子類實現:反序列化時父類調用無參構造初始化ArrayList, HashMap) 已實現 Serializable,可直接序列化readResolve() 返回實例serialVersionUID