在Java中實現(xiàn)序列化和反序列化主要有兩種方式:使用ObjectOutputStream和ObjectInputStream流類,或使用Java序列化API。
序列化是將對象的狀態(tài)信息轉(zhuǎn)換為字節(jié)流的過程,以便將其存儲在文件或數(shù)據(jù)庫中,或通過網(wǎng)絡連接發(fā)送到其他機器上。反序列化則是將字節(jié)流恢復為對象狀態(tài)信息的過程。
下面是一個簡單的示例代碼,演示如何使用ObjectOutputStream和ObjectInputStream對對象進行序列化和反序列化:
import java.io.*;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Serialized object is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized object is: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我們定義了一個Person類,該類實現(xiàn)了Serializable接口。然后,我們創(chuàng)建了一個Person對象,并使用ObjectOutputStream將其序列化到文件person.ser中。接下來,我們使用ObjectInputStream從文件person.ser中反序列化Person對象。
Java序列化API提供了一組接口和類,用于序列化和反序列化Java對象。使用Java序列化API實現(xiàn)序列化和反序列化的步驟與使用ObjectOutputStream和ObjectInputStream類似,但需要更多地使用接口和類。
下面是一個簡單的示例代碼,演示如何使用Java序列化API對對象進行序列化和反序列化:
import java.io.*;
import java.io.Serializable;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class JavaSerializationExample {
public static void main(String[] args) {
Person person = new Person("Bob", 25);
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Serialized object is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized object is: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我們定義了一個Person類,該類實現(xiàn)了Serializable接口。然后,我們創(chuàng)建了一個Person對象,并使用ObjectOutputStream將其序列化到文件person.ser中。接下來,我們使用ObjectInputStream從文件person.ser中反序列化Person對象。
需要注意的是,Java序列化API序列化的對象必須是可序列化的,即該類必須實現(xiàn)Serializable接口。此外,Java序列化API序列化的對象的狀態(tài)信息可以包括對象的成員變量以及對象引用的其他對象的狀態(tài)信息。在反序列化時,Java虛擬機會根據(jù)對象圖中的引用關(guān)系重新構(gòu)建對象。