java序列化

定義:
Java 序列化就是指將對象轉換爲字節序列的過程,
反序列化則是隻將字節序列轉換成目標對象的過程。
面試中關於序列化的問題:
1、什麼是序列化,如何實現序列化
java中對象的序列化就是將對象轉換成二進制序列,反序列化則是將二進制序列轉換成對象
Java 實現序列化有多種方式
1、首先需要使用到工具類ObjectInputStream 和ObjectOutputStream 兩個IO類
2、實現Serializable 接口:
有兩種具體序列化方法:
直接通過ObjectOutputStream 和 ObjectInputStream 類中的 writeObject()和readObject()方法
通過在序列化對象中實現writeObject()和readObject()方法,傳入ObjectOutputStream和ObjectInputStream對象,完成序列化 
                   
3、實現Externalizable 接口: 
只能夠通過實現接口中的writeExternal()和readExternal()方法實現對象的序列化
2、transient 關鍵字?如何將transient修飾符修飾的變量序列化? 
transient 的作用是用來屏蔽我們不希望進行序列化的變量,是對象在進行序列化和反序列話的過程中忽略該變量。我們可以通過上述序列化方法中的實現writeObject和readObject方法,在方法中調用輸出流或輸入流的writeUTF()和readUTF()方法。或者通過實現Externalizable接口,實現writeExternal()和readExternal()方法,然後再自定義序列化對象。
      
3、如何保證序列化和反序列化後的對象一致?(如有異議望指正) 
對於這個問題我在查閱了一些資料之後,發現並不能保證序列化和反序列化之後的對象是一致的,因爲我們在反序列化的過程中,是先創建一個對象,然後再通過對對象進行賦值來完成對象的反序列化,這樣問題就來了,在創建了一個新的對象之後,對象引用和原本的對象並不是指向同一個目標。因此我們只能保證他們的數據和版本一致,並不能保證對象一致。


4、ArrayList的序列化

why transient

ArrayList實際上是動態數組,每次在放滿以後自動增長設定的長度值,如果數組自動增長長度設爲100,而實際只放了一個元素,那就會序列化99個null元素。爲了保證在序列化的時候不會將這麼多null同時進行序列化,ArrayList把元素數組設置爲transient。

why writeObject and readObject

前面說過,爲了防止一個包含大量空對象的數組被序列化,爲了優化存儲,所以,ArrayList使用transient來聲明elementData。 但是,作爲一個集合,在序列化過程中還必須保證其中的元素可以被持久化下來,所以,通過重寫writeObject  readObject方法的方式把其中的元素保留下來。
writeObject方法把elementData數組中的元素遍歷的保存到輸出流(ObjectOutputStream)中。
readObject方法從輸入流(ObjectInputStream)中讀出對象並保存賦值到elementData數組中。

如果一個類中包含writeObject 和 readObject 方法,那麼這兩個方法是怎麼被調用的?
答:在使用ObjectOutputStream的writeObject方法和ObjectInputStream的readObject方法時,會通過反射的方式調用。
1、如果一個類想被序列化,需要實現Serializable接口。否則將拋出NotSerializableException異常,這是因爲,在序列化操作過程中會對類型進行檢查,要求被序列化的類必須屬於Enum、Array和Serializable類型其中的任何一種。
2、在變量聲明前加上該關鍵字,可以阻止該變量被序列化到文件中。
3、在類中增加writeObject 和 readObject 方法可以實現自定義序列化策略,可以進行一些信息的加密
4、序列化不保存靜態變量
5、要想將父類對象也序列化,就需要讓父類也實現Serializable 接口。如果父類不實現的話的,就 需要有默認的無參的構造函數
6、Java 序列化機制爲了節省磁盤空間,具有特定的存儲規則,當寫入文件的爲同一對象時,並不會再將對象的內容進行存儲,而只是再次存儲一份引用,上面增加的 5 字節的存儲空間就是新增引用和一些控制信息的空間。反序列化時,恢復引用關係,使得清單 3 中的 t1 和 t2 指向唯一的對象,二者相等,輸出 true。該存儲規則極大的節省了存儲空間。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章