首頁 >Java >java教程 >Java 中的序列化與反序列化

Java 中的序列化與反序列化

王林
王林原創
2023-06-08 08:01:091837瀏覽

Java 中的序列化和反序列化

序列化是指將物件的狀態轉換為位元組流的過程,以便可以在網路上傳輸或永久保存到磁碟中。反序列化則是將序列化的位元組流恢復為物件的過程。在 Java 中,序列化和反序列化是透過 ObjectInputStream 和 ObjectOutputStream 實現的。

為什麼我們需要序列化?

在現代應用程式中,物件的狀態通常需要在不同的系統、進程和執行緒之間進行傳遞。例如,在分散式系統中,物件可能需要在不同的伺服器之間進行傳遞。另一個例子是在快取中儲存物件時,物件需要序列化以便可以保存到磁碟中。

Java 中的序列化

Java 提供了一個 Serializable 介面來實現序列化。 Serializable 介面只是一個標記接口,沒有任何方法,它只是告訴編譯器,這個類別是可序列化的。如果一個類別實作了 Serializable 接口,則該類別的物件可以被序列化。例如:

public class Person implements Serializable {
  private static final long serialVersionUID = 1L;
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }
}

在上面的例子中,Person 類別實作了 Serializable 接口,表示該類別可以被序列化。

Java 中的反序列化

Java 中的反序列化是將序列化的位元組流恢復為物件的過程。可以使用 ObjectInputStream 類別實現反序列化。例如:

try {
  FileInputStream fileIn = new FileInputStream("person.ser");
  ObjectInputStream in = new ObjectInputStream(fileIn);
  Person person = (Person) in.readObject();
  in.close();
  fileIn.close();
} catch (IOException i) {
  i.printStackTrace();
} catch (ClassNotFoundException c) {
  c.printStackTrace();
}

在上面的範例中,我們先建立了一個 FileInputStream 對象,然後傳遞給 ObjectInputStream 建構子來建立 ObjectInputStream 物件。之後,我們使用 readObject() 方法從 ObjectInputStream 中讀取物件。最後,我們關閉 ObjectInputStream 和 FileInputStream。

要注意的是,當你進行反序列化時,序列化的類別必須存在。如果序列化的類別不存在,則會拋出 ClassNotFoundException 異常。

Java 中的序列化和反序列化是非常重要的,它允許物件在不同的系統、進程和執行緒之間進行傳遞。同時,Java 也提供了一些方法來控制物件的序列化和反序列化行為,例如 transient、writeObject() 和 readObject() 等方法。由於序列化和反序列化對性能的影響較大,因此在適當的情況下應避免使用它們。

以上是Java 中的序列化與反序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn