【JAVA基礎】Serializable序列化

1. 為什么要實現Serializable序列化

主要有以下幾個方面必須序列化
(1)想把的內存中的對象狀態持久化保存到一個文件中或者數據庫中時候。
具體比如使用ObjectInputStream 和 ObjectOutputStream 進行對象的讀寫。

 /**
     * 序列化
     */
    private static void serializeFlyPig() throws IOException {
        FlyPig flyPig = new FlyPig();
        flyPig.setColor("black");
        flyPig.setName("naruto");
        flyPig.setCar("0000");
        // ObjectOutputStream 對象輸出流,將 flyPig 對象存儲到E盤的 flyPig.txt 文件中,完成對 flyPig 對象的序列化操作
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/flyPig.txt")));
        oos.writeObject(flyPig);
        System.out.println("FlyPig 對象序列化成功!");
        oos.close();
    }

(2)想把對象通過網絡進行傳播的時候。
(3)通過RMI(遠程方法調用)傳輸對象的時候。
dubbo服務在調用的時候,傳輸的實體必須要實現序列化
(4)對象需要存儲在session中時。

2. serialVersionUID是什么作用

系列化與反系列化中,是否允許反序列化,一個非常重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L),如果serialVersionUID不同,你將得到一個InvalidClassException異常。
serialVersionUID值有三種設置方法:
(1)沒有明確的給這個 serialVersionUID 賦值,但是,Java會自動賦值的。這個值跟這個對象屬性相關計算出來的。這樣的話容易導致序列化時的serialVersionUID值和反序列化的時候Java自動生成的這個serialVersionUID值是不同的(期間添加了新屬性導致),導致異常。不推薦此法。
(2)一個是固定的 1L
如果沒有特殊需求,就是用默認的 1L 就可以,這樣可以確保代碼一致時反序列化成功
(3)隨機生成一個不重復的 long 類型數據(實際上是使用 JDK 工具生成)
有些時候,通過改變序列化 ID 可以用來限制某些用戶的使用??蛻舳撕头斩说膕erialVersionUID 都統一由服務端生成,那么服務端序列化后通過網絡將二進制對象數據傳給客戶端,客戶端負責反序列化得到對象,該模式可以使得客戶端程序的使用需要服務器端的許可。

3. JavaBean是否真的需要實現Serializable

(1)疑問

  • 一個對象返回給前端,那么該對象是否需要實現 Serializable接口。
  • 前后端進行數據交互一般都是json格式的數據,那么是誰在什么時候將我們的對象轉換成json格式的。

(2) 解答
SpringMVC框架返回一個json串給前端只需要將對象返回并且在方法上加上@ResponseBody注解。
原理是通過jackson將對象轉換成json字符串。轉換的過程中并沒有調用對象的writeObject(java.io.ObjectOutputStream s) 來進行序列化。網絡傳輸打交道的是SpringMVC轉換后的json字符串,實體對象與網絡并沒用直接的接觸,所以這里的實體對象無需實現Serializable接口。

總結:對象需要網絡傳輸或者持久化(對象直接轉換為字節的形式傳輸),那么就需要實現Serializable接口。如果只是轉換為字符串的形式與網絡打交道,那么就不需要實現Serializable接口。

4.序列化和json區別

javaBean序列化在傳輸和存儲有時會需要用到,JSON也是一樣,他們有區別在哪里昵:
(1)長度的比較
serialize在編碼后大概是json的兩倍。
(2)速度的比較
serialize的速度在大數據量的情況下比json差了快一個數量級。
從上面兩點看,json不管是在速度還是在生成的字符串的大小上都比serialize要好,那為什么serialize還要存在呢:json無法處理對象方法等數據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容