java序列化 如何实现java序列化
实现Java序列化的步骤
实现Serializable接口
需要序列化的类必须实现java.io.Serializable接口。这是一个标记接口,没有需要实现的方法,仅用于标识该类可以被序列化。
public class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter和setter省略
}
定义serialVersionUID(可选但推荐)serialVersionUID是一个版本控制字段,用于确保序列化和反序列化时类的版本一致。如果没有显式定义,Java会根据类结构自动生成,但类结构变化时可能导致兼容性问题。
private static final long serialVersionUID = 1L;
使用ObjectOutputStream和ObjectInputStream
通过ObjectOutputStream将对象写入文件或网络流,通过ObjectInputStream读取并还原对象。

// 序列化对象到文件
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(new Person("Alice", 30));
}
// 从文件反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println(person.getName()); // 输出: Alice
}
注意事项
瞬态字段(transient)
标记为transient的字段不会被序列化,适用于敏感数据或无需持久化的字段。
private transient String password;
静态字段
静态变量属于类而非对象,不会被序列化。

自定义序列化逻辑
通过实现writeObject和readObject方法,可以覆盖默认的序列化行为。
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); // 默认序列化
// 自定义逻辑
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 默认反序列化
// 自定义逻辑
}
Externalizable接口
与Serializable不同,Externalizable要求实现writeExternal和readExternal方法,完全控制序列化过程。
public class Person implements Externalizable {
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject();
}
}






