Java序列化是指將一個(gè)Java對(duì)象轉(zhuǎn)換為一個(gè)字節(jié)序列,以便將其保存到文件中或通過(guò)網(wǎng)絡(luò)傳輸?shù)狡渌?jì)算機(jī)。Java反序列化是指將字節(jié)序列轉(zhuǎn)換回Java對(duì)象。
Java中實(shí)現(xiàn)序列化和反序列化的核心類是ObjectOutputStream和ObjectInputStream。ObjectOutputStream提供了一個(gè)方法,可以將Java對(duì)象寫(xiě)入輸出流中。ObjectInputStream提供了一個(gè)方法,可以從輸入流中讀取Java對(duì)象。
為了使Java對(duì)象可序列化,必須在類定義中添加一個(gè)特殊的標(biāo)記接口Serializable。這個(gè)接口沒(méi)有任何方法,它只是指示這個(gè)類可以被序列化。
以下是一個(gè)簡(jiǎn)單的例子,展示了如何將一個(gè)對(duì)象序列化到文件中,然后從文件中反序列化回來(lái):
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// Create an object to be serialized
MyClass object = new MyClass("Hello", 123);
// Serialize the object to a file
try (FileOutputStream fos = new FileOutputStream("file.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(object);
} catch (IOException e) {
e.printStackTrace();
}
// Deserialize the object from the file
try (FileInputStream fis = new FileInputStream("file.ser");
ObjectInputStream ois = new ObjectInputStream(fis)) {
MyClass deserializedObject = (MyClass) ois.readObject();
System.out.println(deserializedObject);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class MyClass implements Serializable {
private String message;
private int number;
public MyClass(String message, int number) {
this.message = message;
this.number = number;
}
public String getMessage() {
return message;
}
public int getNumber() {
return number;
}
@Override
public String toString() {
return "MyClass{" +
"message='" + message + '\'' +
", number=" + number +
'}';
}
}
在上面的例子中,MyClass實(shí)現(xiàn)了Serializable接口,并將其對(duì)象序列化到名為“file.ser”的文件中。然后,我們從文件中反序列化對(duì)象,并打印出它的內(nèi)容。注意,在反序列化對(duì)象時(shí),必須將Object類型的返回值強(qiáng)制轉(zhuǎn)換為我們的自定義類型MyClass。