一、什么是序列化?
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。如果一个对象可以被序列化,那么就可以将其状态保存到磁盘上,或者通过网络传输。在 Java 中,序列化主要由 java.io.ObjectOutputStream
和 java.io.ObjectInputStream
类来实现。
二、序列化的原理
当一个对象被序列化时,它会被转换成字节流。这个过程包括对象的类信息、对象的数据成员等。序列化通常用于以下场景:
- 保存对象的状态到文件中以便以后使用(持久化)。
- 在网络上传输对象。
- 将对象存储在字节数组中以备后续处理或使用。
三、实现序列化的基本步骤
要使一个类的对象可以被序列化,这个类必须实现 Serializable
接口。这是一个标记接口,表示实现了它的对象可以被序列化。
示例代码:
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
}
序列化可以通过 ObjectOutputStream
实现:
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) {
User user = new User("Alice", 30);
try (FileOutputStream fos = new FileOutputStream("user.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(user);
System.out.println("User object has been serialized to user.ser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、反序列化
反序列化是序列化的逆过程,即将字节流转换回对象。这通常用于恢复从文件或网络读取的对象实例。
示例代码:
import java.io.*;
public class DeserializeDemo {
public static void main(String[] args) {
User user = null;
try (FileInputStream fis = new FileInputStream("user.ser");
ObjectInputStream ois = new ObjectInputStream(fis)) {
user = (User) ois.readObject();
System.out.println("Deserialized User...");
System.out.println("Name: " + user.getName());
System.out.println("Age: " + user.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
五、注意事项
- 版本兼容性:序列化时会检查
serialVersionUID
,如果类进行了修改,需要确保serialVersionUID
的一致性,否则可能会导致InvalidClassException
。 - 敏感数据保护:对于敏感信息如密码等,不应进行序列化。
- 定制序列化:可以重写
writeObject()
和readObject()
方法来控制序列化和反序列化的细节。