java序列化

 

序列化:將對象寫入到IO流中
反序列化:從IO流中恢復對象
意義:序列化機制容許將實現序列化的Java對象轉換位字節序列,這些字節序列能夠保存在磁盤上,或經過網絡傳輸,以達到之後恢復成原來的對象。序列化機制使得對象能夠脫離程序的運行而獨立存在。
使用場景:全部可在網絡上傳輸的對象都必須是可序列化的,好比RMI(remote method invoke,即遠程方法調用),傳入的參數或返回的對象都是可序列化的,不然會出錯;全部須要保存到磁盤的java對象都必須是可序列化的。一般建議:程序建立的每一個JavaBean類都實現Serializeable接口。java


java自己的序列化機制存在的問題
1. 序列化數據結果比較大、傳輸效率比較低
2. 不能跨語言對接安全

恰當的序列化協議不只能夠提升系統的通用性、強壯型、安全性、優化性能。同時還能讓系統更加易於調試和擴展網絡

實現一個序列化操做
1. 實現Serializable接口
2. ObjectInputStream : 表示讀取指定的字節數據轉換成對象
3. ObjectOutputStream :性能


serialVersionUID優化

java序列化提供了一個private static final long serialVersionUID 的序列化版本號,只有版本號相同,即便更改了序列化屬性,對象也能夠正確被反序列化回來調試

靜態變量的序列化
序列化並不保存靜態變量的狀態xml


Transient關鍵字
transient關鍵字表示指定屬性不參與序列化對象


父子類問題
若是父類沒有實現序列化,而子類實現列序列化。那麼父類中的成員沒辦法作序列化操做
序列化的存儲規則
對同一個對象進行屢次寫入,打印出的第一次存儲結果和第二次存儲結果,只多了5個字節的引用關係。
並不會致使文件累加接口

 

序列化實現深度克隆
淺拷貝(淺複製、淺克隆):被複制對象的全部變量都含有與原來的對象相同的值,而全部的對其餘對象的引用仍然指向原來的對象。
  換言之,淺拷貝僅僅複製所拷貝的對象,而不復制它所引用的對象。
深拷貝(深複製、深克隆):被複制對象的全部變量都含有與原來的對象相同的值,除去那些引用其餘對象的變量。
  那些引用其餘對象的變量將指向被複制過的新對象,而再也不是原有的那些被引用的對象。
  換言之,深拷貝把要複製的對象所引用的對象都複製了一遍rem

 

總結
1. 在java中,只要一個類實現了java.io.Serializable接口,那麼它就能夠被序列化
2. 經過ObjectOutputStream和ObjectInputStream對對象進行序列化合反序列化操做
3. 對象是否容許被反序列化,不單單是取決於對象的代碼是否一致,同時還有一個重要的因素(UID)
4. 序列化不保存靜態變量
5. 要想父類對象也參與序列化操做,那麼必需要讓父類也實現Serializable接口
6. Transient關鍵字,主要是控制變量是否可以被序列化。若是沒有被序列化的成員變量反序列化後,會被設置成初始值,好比String -> null
7. 經過序列化操做實現深度克隆

 

主流的序列化技術xml/JSON/Hessian(2) /xml/protobuf/kryo/MsgPack/FST/thrift/protostuff/Avro

相關文章
相關標籤/搜索