介紹
Java序列化及反序列化是Java編程中經常用到的技術,它們允許對象以位元組流的形式在網路上傳輸或持久化到磁碟。正是由於Java序列化能夠將對象轉換成磁碟上或網路上傳輸的位元組流,使我們可以輕鬆地進行深度克隆、對象傳輸和數據交換等操作。
Java對象序列化機制是將對象的狀態信息轉換為可以存儲在磁碟文件或在網路中傳輸的位元組序列的過程。
序列化
Java對象序列化是Java API中提供的一種機制,依據該機制可以將任何實現了Serializable介面的Java對象轉換為位元組流表示,然後可以將位元組流表示的對象保存到磁碟中,或通過網路傳輸到遠程系統。
實現
實現Java對象序列化僅需以下簡單步驟:
- 創建實現序列化介面Serializable的類。
- 實例化該類的對象。
- 創建ObjectOutputStream對象。該對象用於將將對象寫入流中。
- 調用ObjectOutputStream.writeObject()方法,將對象寫入流中。
- 流刷新並關閉。
//創建一個User對象 public class User implements Serializable { private String username; private String password; private int age; //獲取username、password、age等屬性的getters和setters方法省略 //toString方法 public String toString() { return "username=" + username + ";password=" + password + ";age=" + age; } } //serializing代碼 public class SerializingObject { public static void main(String[] args) { User user = new User("Tom", "123456", 18); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("user.txt")); oos.writeObject(user); System.out.println("User對象序列化成功!"); } catch (IOException e) { e.printStackTrace(); } finally { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
反序列化
反序列化是將位元組數組還原成Java對象的過程。Java提供了一個ObjectInputStream類用於從流中反序列化對象。
實現
實現Java對象反序列化也很簡單,僅需以下幾個步驟:
- 創建ObjectInputStream對象,該對象用於從流中讀取對象。
- 調用ObjectInputStream.readObject()方法,將對象還原成Java對象。
public class DeSerializingObject { public static void main(String[] args) { ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("user.txt")); User user = (User) ois.readObject(); System.out.println("User對象反序列化成功!對象信息如下:"); System.out.println(user.toString()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } }
要點
不適用於所有對象
Java序列化機制無法序列化static和transient修飾的成員變數,因為static修飾的成員變數不屬於對象的狀態,而transient修飾的成員變數代表不希望被序列化持久化。若序列化對象中帶有以上修飾符修飾的成員變數,需要注意這些變數的序列化和反序列化使用。
版本控制
對象的版本控制對序列化和反序列化具有重要影響。當一個對象被序列化後被修改,反序列化可能會失敗,因為反序列化時默認比較對象的serialVersionUID是否一致。若不一致,則反序列化失敗無法還原Java對象。因此,在對優先序列化的對象進行版本控制時,需要指定serialVersionUID來保證版本的一致。
public class User implements Serializable { private static final long serialVersionUID = 143857367482L; //其他代碼省略 }
安全問題
由於可以通過Java序列化機制將對象序列化成二進位碼,因此Java序列化機制可能會帶來安全問題。惡意攻擊者可以序列化惡意對象並發送給接收者從而導致安全問題。針對該問題,可以使用Java對象序列化框架,如Hessian、Kryo等,去解決Java序列化安全問題。
總結
Java序列化及反序列化可將Java對象序列化成位元組流從而便於傳輸、存儲和分發。其序列化和反序列化過程非常簡單,但需要注意一些使用小細節和實際安全問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249110.html