Java序列化是指把Java對象轉換爲字節序列的過程,而Java反序列化是指把字節序列恢復爲Java對象的過程:java
序列化:對象序列化的最主要的用處就是在傳遞和保存對象的時候,保證對象的完整性和可傳遞性。序列化是把對象轉換成有序字節流,以便在網絡上傳輸或者保存在本地文件中。核心做用是對象狀態的保存與重建。面試
反序列化:客戶端從文件中或網絡上得到序列化後的對象字節流,根據字節流中所保存的對象狀態及描述信息,經過反序列化重建對象。數據庫
爲何要序列化,那就是說一下序列化的好處嘍,序列化有什麼什麼優勢,因此咱們要序列化。網絡
一:對象序列化能夠實現分佈式對象。多線程
主要應用例如:RMI(即遠程調用Remote Method Invocation)要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時同樣。分佈式
二:java對象序列化不只保留一個對象的數據,並且遞歸保存對象引用的每一個對象的數據。this
能夠將整個對象層次寫入字節流中,能夠保存在文件中或在網絡鏈接上傳遞。利用對象序列化能夠進行對象的"深複製",即複製對象自己及引用的對象自己。序列化一個對象可能獲得整個對象序列。url
三:序列化能夠將內存中的類寫入文件或數據庫中。spa
好比:將某個類序列化後存爲文件,下次讀取時只需將文件中的數據反序列化就能夠將原先的類還原到內存中。也能夠將類序列化爲流數據進行傳輸。.net
總的來講就是將一個已經實例化的類轉成文件存儲,下次須要實例化的時候只要反序列化便可將類實例化到內存中並保留序列化時類中的全部變量和狀態。
四:對象、文件、數據,有許多不一樣的格式,很難統一傳輸和保存。
序列化之後就都是字節流了,不管原來是什麼東西,都能變成同樣的東西,就能夠進行通用的格式傳輸或保存,傳輸結束之後,要再次使用,就進行反序列化還原,這樣對象仍是對象,文件仍是文件。
首先咱們要把準備要序列化類,實現 Serializabel接口
例如:咱們要Person類裏的name和age都序列化
import java.io.Serializable; public class Person implements Serializable { //本類能夠序列化 private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "姓名:" + this.name + ",年齡" + this.age; } }
而後:咱們將name和age序列化(也就是把這2個對象轉爲二進制,理解爲「打碎」)
package org.lxh.SerDemo; import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo { //序列化 public static void main(String[] args) throws Exception { //序列化後生成指定文件路徑 File file = new File("D:" + File.separator + "person.ser"); ObjectOutputStream oos = null; //裝飾流(流) oos = new ObjectOutputStream(new FileOutputStream(file)); //實例化類 Person per = new Person("張三", 30); oos.writeObject(per); //把類對象序列化 oos.close(); } }
一個很簡單的示例,文章以應答面試提問爲主,更深瞭解序列化與反序列化,須要你上網多參考資料。
好比:
《Java對象的序列化(Serialization)和反序列化詳解》
http://www.javashuo.com/article/p-mbcgwvhd-ky.html
《Java 序列化的高級認識》
https://www.ibm.com/developerworks/cn/java/j-lo-serial/
好了,學起來!
最近三期