Java序列化是将对象的状态转换为字节流的过程,以便存储或在网络上传输。反序列化则是将字节流恢复为对象的过程。Java提供内置的序列化机制,通过实现Serializable
接口来标记一个类可被序列化。
Serializable
的类不能被序列化。transient
关键字或writeObject
/readObject
方法。transient
关键字:对于不想序列化的字段,可以标记为transient
。serialVersionUID
字段确保序列化版本的一致性。下面是一个简单的序列化和反序列化示例:
import java.io.*;
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;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
User user = new User("Alice", 30);
System.out.println("Before serialization: " + user);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"))) {
oos.writeObject(user);
}
User deserializedUser;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {
deserializedUser = (User) ois.readObject();
}
System.out.println("After deserialization: " + deserializedUser);
}
}
在这个例子中,User
类实现了Serializable
接口,然后我们创建一个User
对象,序列化到文件user.ser
,再从文件反序列化回User
对象。
通过理解和正确使用Java的序列化机制,你可以更有效地存储和传输对象状态。同时,要注意潜在的安全和性能问题,并采取适当的措施来解决。