Java 中的序列化(Serialization)和反序列化(Deserialization)是用于将对象转换为字节流以便于存储或传输,并在需要时将字节流重新转换为对象的过程。这个过程主要涉及以下两个方面:
序列化(Serialization):
- 序列化是将一个对象的状态转换为字节流的过程,以便于将其保存到文件、数据库或通过网络传输。
- 在 Java 中,你可以通过实现
java.io.Serializable
接口来指示一个类是可序列化的。这个接口没有任何方法,只是一个标记接口,用于表示类的对象可以被序列化。 - 序列化通常使用
ObjectOutputStream
来执行,你将需要将要序列化的对象传递给它,然后它将对象转换为字节流并写入输出流中。
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// 创建一个对象
MyObject obj = new MyObject(42, "Hello, World!");
try {
// 将对象序列化到文件
FileOutputStream fileOut = new FileOutputStream("object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(obj);
out.close();
fileOut.close();
System.out.println("对象已被序列化到文件。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
反序列化(Deserialization):
- 反序列化是将字节流重新转换为对象的过程,以便在程序中重新使用对象的状态。
- 在 Java 中,你可以使用
ObjectInputStream
来执行反序列化操作,从文件或网络流中读取字节流,并将其还原为对象
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
MyObject obj = null;
try {
// 从文件中反序列化对象
FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
obj = (MyObject) in.readObject();
in.close();
fileIn.close();
System.out.println("对象已从文件反序列化。");
System.out.println("整数属性:" + obj.getIntegerValue());
System.out.println("字符串属性:" + obj.getStringValue());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
需要注意的是,要成功序列化和反序列化一个对象,该对象的类必须实现 java.io.Serializable
接口,并且其所有成员变量也必须是可序列化的,或者标记为 transient
,以防止被序列化。否则,将会抛出 java.io.NotSerializableException
异常。
总之,序列化和反序列化是在 Java 中用于持久化对象数据和在网络中传输对象的重要机制,它们允许对象在不同的上下文中进行传输和存储