Java中的序列化介面
Serializable 介面提供了一種序列化物件的功能。它不定義任何方法和成員變數。當一個類實現 Serializable 介面時,它僅僅表示該類及其子類可以被序列化。Serializable 介面用於實現物件的序列化和反序列化。
在這篇文章中,我們將討論 Java 中 Serializable 介面的使用,並提供示例。
Java 中的序列化和反序列化
序列化是一種將給定物件表示為位元組序列的機制,其反向操作是反序列化,它將位元組序列表示為物件。除了靜態和瞬態變數之外,類的所有成員都可以在序列化過程中被保留。這些操作有很多應用,其中之一是遠端方法呼叫,它允許從一臺機器呼叫另一臺機器上的方法。
正如我們之前討論的,使用序列化功能的唯一方法是使用 Serializable 介面。因此,我們需要首先實現它。
Serializable 介面的語法
accesSpecifier class nameOfclass implements Serializable { // your code here }
訪問修飾符 − 用於設定方法的可訪問性。它可以是 public、protected、預設和 private。
implements − 是一個關鍵字,它使類能夠使用與其關聯的介面的功能。
要使用 Serializable 介面,需要匯入以下包:
import java.io.*;
這裡,* 表示我們正在將此包中所有可用的類和方法匯入到我們的程式中。
在深入瞭解 Serializable 介面的示例之前,有必要再討論一些事情。
ObjectOutputStream
它是 OutputStream 類的子類,並實現了 ObjectOutput 介面。它包含各種方法,其中 writeObject 是其中之一,它以物件作為引數,並將其轉換為位元組序列,這意味著它會序列化給定的物件。只有實現 Serializable 介面的類的物件才能作為引數傳遞。
語法
writeObject(nameOfobject);
ObjectInputStream
它是 InputStream 類的子類,並實現了 ObjectInput 介面。它包含各種方法,其中 readObject 是其中之一,它將位元組流轉換回物件,這意味著它執行反序列化。
語法
readObject();
示例 1
在下面的示例中,我們將瞭解 Serializable 介面的實現。
演算法
步驟 1 − 我們將從定義一個名為“Details”的類開始,該類實現了 Serializable 介面。在這個類中,宣告兩個例項變數“st”和“id”。這些資訊稍後將被序列化和反序列化。
步驟 2 − 在 main 方法中,定義一個 try 塊。在這個塊中,為 FileOutputStream 的檔案流建立一個名為“strmOut”的 ObjectOutputStream 類物件。這裡,FileOutputStream 指的是檔名“stream”。然後使用“writeObject”方法,我們將序列化“Details”類的“obj1”。
步驟 3 − 在下一個 try 塊中,我們將為 FileInputStream 的檔案流建立一個名為“strmIn”的 ObjectInputStream 類物件。這裡,FileInputStream 指的是檔名“stream”。然後使用“readObject”方法,我們將反序列化物件並列印結果。
步驟 4 − 對應 try 塊的 catch 塊將處理整個過程中發生的任何型別的異常。
import java.io.*; class Details implements Serializable { String st; int id; public Details(String st, int id) { // constructor this.st = st; this.id = id; } // method for converting object into string public String toString() { return "st = " + st + ", id = " + id; } } public class SerialDemo { public static void main(String args[]) { // code for serialization of object try { // creating object of ObjectOutputStream ObjectOutputStream strmOut = new ObjectOutputStream(new FileOutputStream("stream")); // passing data to object 1 Details obj1 = new Details("Tutorial 1", 121); System.out.println("Data of object 1 is passed to object2...."); strmOut.writeObject(obj1); } catch(IOException exp) { System.out.println("Exception occurred during serialization of Object 1: " + exp); } // code for deserialization of object try { // creating object of ObjectInputStream ObjectInputStream strmIn = new ObjectInputStream(new FileInputStream("stream")); // reading the details of object 1 Details obj2 = (Details)strmIn.readObject(); System.out.println("Data of object 2: " + obj2); } catch(Exception exp) { System.out.println("Exception occurred during deserialization of Object 2: " + exp); } } }
輸出
Data of object 1 is passed to object2.... Data of object 2: st = Tutorial 1, id = 121
結論
Serializable 介面的唯一用例是物件的序列化和反序列化。我們可以在序列化物件中儲存文字、音訊或任何自定義資料。在這篇文章中,我們列出了幫助我們完成此過程的所有方法。