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中文網其他相關文章!