在高階Java中,序列化和反序列化是保存和復原物件狀態的過程,使得可以將物件儲存在檔案或資料庫中,或透過網路傳輸它們。以下是這些概念及其應用的詳細介紹
1️⃣連載
序列化是將物件轉換為位元組流的過程。此位元組流可以儲存到檔案中、透過網路傳送或儲存在資料庫中。在Java中,Serialized介面用來表示類別可以被序列化。
✍ 序列化物件的步驟:
▶️ 實作 Serialized 介面。
▶️ 使用 ObjectOutputStream 和 FileOutputStream 將物件寫入檔案或輸出流。
▶️ 在 ObjectOutputStream 上呼叫 writeObject() 方法。
?程式碼範例:
import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Employee implements Serializable { private static final long serialVersionUID = 1L; String name; int id; public Employee(String name, int id) { this.name = name; this.id = id; } } public class SerializeDemo { public static void main(String[] args) { Employee emp = new Employee("John Doe", 101); try (FileOutputStream fileOut = new FileOutputStream("employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut)) { out.writeObject(emp); System.out.println("Serialized data is saved in employee.ser"); } catch (Exception e) { e.printStackTrace(); } } }
這裡,employee.ser 是一個儲存物件位元組流的序列化檔案。
2️⃣ 反序列化
反序列化是相反的過程,其中位元組流被轉換回原始物件的副本。這使您能夠在儲存或傳輸物件後重新建立物件的狀態。
✍ 反序列化物件的步驟:
▶️ 使用 ObjectInputStream 和 FileInputStream 從檔案或輸入流中讀取物件。
▶️ 呼叫 ObjectInputStrea 上的 readObject() 方法
?程式碼範例:
import java.io.FileInputStream; import java.io.ObjectInputStream; public class DeserializeDemo { public static void main(String[] args) { Employee emp = null; try (FileInputStream fileIn = new FileInputStream("employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn)) { emp = (Employee) in.readObject(); System.out.println("Deserialized Employee..."); System.out.println("Name: " + emp.name); System.out.println("ID: " + emp.id); } catch (Exception e) { e.printStackTrace(); } } }
這將檢索物件的原始狀態,允許存取其字段,就像序列化之前一樣。
3️⃣ 進階連載主題
▶️ 自訂序列化:重寫 writeObject() 和 readObject() 以進行自訂序列化。
▶️ 可外部化介面:提供序列化的完全控制,需要實作 writeExternal() 和 readExternal() 方法。
▶️ 瞬態欄位:使用瞬態關鍵字來避免序列化特定欄位(例如密碼等敏感資料)。
✍ 序列化的優點:
▶️ 允許保存物件的狀態以供將來使用。
▶️ 促進複雜資料物件通過網路的傳輸。
?簡單解釋一下程式碼範例
import java.io.*; class Student implements Serializable { private static final long serialVersionUId = 1l; private String name ; private int age; private String Address; public Student(String name,int age,String Address){ this.name = name; this.age = age; this.Address = Address; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void setAddress(String Address){ this.Address = Address; } public String getName(){ return name; } public String getAddress(){ return Address; } public int getAge(){ return age; } public String toString(){ return ("Student name is "+this.getName()+", age is "+this.getAge()+", and address is "+this.getAddress()); } } public class JAVA3_Serialization { // when you implement Serializable then you must be write a serialVersionUId because when it serialise and deserialize it uniquely identify in the network // when u update ur object or anything then you have to update the serialVersionUId increment . // private static final long serialVersionUId = 1l; // transient int x ; // If you do not want a particular value to serialise and Deserialize. // the value x, when you don't serialise and Deserialize Then transient you used. public static void main(String[] args) { Student student = new Student("kanha",21,"angul odisha"); String filename = "D:\Advance JAVA\CLS3 JAVA\Test.txt"; // store the data in this location FileOutputStream fileOut = null; // write file ObjectOutputStream objOut = null; // create object //Serialization try { fileOut = new FileOutputStream(filename); objOut = new ObjectOutputStream(fileOut); objOut.writeObject(student); objOut.close(); fileOut.close(); System.out.println("Object has been serialise =\n"+student); } catch (IOException ex){ System.out.println("error will occure"); } //Deserialization FileInputStream fileIn = null; ObjectInputStream objIn = null; try { fileIn = new FileInputStream(filename); objIn = new ObjectInputStream(fileIn); Student object =(Student) objIn.readObject(); System.out.println("object has been Deserialization =\n"+object); objIn.close(); fileIn.close(); } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
✍ 重點:
▶️ 預設僅序列化非靜態和非瞬態資料成員。
▶️ 如果序列化後修改了類,可序列化物件必須確保版本之間的相容性。
如需更多見解,請隨時提及您的 GitHub 以獲取深入的範例和程式碼範例!如果您需要任何具體調整,請告訴我。
GitHub - https://github.com/Prabhanjan-17p
以上是Java 中的序列化與反序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1
好用且免費的程式碼編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境