Java IO詳解——序列化與反序列化(對象流)
1、什麼是序列化與反序列化?
序列化:指把堆內存中的 Java 對象數據,通過某種方式把對象存儲到磁碟文件中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將數據結構或對象轉換成二進位串的過程
反序列化:把磁碟文件中的對象數據或者把網路節點上的對象數據,恢復成Java對象模型的過程。也就是將在序列化過程中所生成的二進位串轉換成數據結構或者對象的過程
2、為什麼要做序列化?
①、在分布式系統中,此時需要把對象在網路上傳輸,就得把對象數據轉換為二進位形式,需要共享的數據的 JavaBean 對象,都得做序列化。
②、伺服器鈍化:如果伺服器發現某些對象好久沒活動了,那麼伺服器就會把這些內存中的對象持久化在本地磁碟文件中(Java對象轉換為二進位文件);如果伺服器發現某些對象需要活動時,先去內存中尋找,找不到再去磁碟文件中反序列化我們的對象數據,恢復成 Java 對象。這樣能節省伺服器內存。
3、Java 怎麼進行序列化?
①、需要做序列化的對象的類,必須實現序列化介面:Java.lang.Serializable 介面(這是一個標誌介面,沒有任何抽象方法),Java 中大多數類都實現了該介面,比如:String,Integer
②、底層會判斷,如果當前對象是 Serializable 的實例,才允許做序列化,Java對象 instanceof Serializable 來判斷。
③、在 Java 中使用對象流來完成序列化和反序列化
ObjectOutputStream:通過 writeObject()方法做序列化操作
ObjectInputStream:通過 readObject() 方法做反序列化操作
第一步:創建一個 JavaBean 對象
第二步:使用 ObjectOutputStream 對象實現序列化
我們打開 a.txt 文件,發現裡面的內容亂碼,注意這不需要我們來看懂,這是二進位文件,計算機能讀懂就行了。
錯誤一:如果新建的 Person 對象沒有實現 Serializable 介面,那麼上面的操作會報錯:
第三步:使用ObjectInputStream 對象實現反序列化
反序列化的對象必須要提供該對象的位元組碼文件.class
問題1:如果某些數據不需要做序列化,比如密碼,比如上面的年齡?
解決辦法:在欄位面前加上 transient
那麼我們在反序列化的時候,列印出來的就是Person [name=vae, age=0],整型數據默認值為 0
問題2:序列化版本問題,在完成序列化操作後,由於項目的升級或修改,可能我們會對序列化對象進行修改,比如增加某個欄位,那麼我們在進行反序列化就會報錯:
解決辦法:在 JavaBean 對象中增加一個 serialVersionUID 欄位,用來固定這個版本,無論我們怎麼修改,版本都是一致的,就能進行反序列化了
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!
※對《深入理解Java虛擬機》的總結(一)
※Java圖片上傳(mvc)
※Java為什麼對常量的修改沒有生效?
※一名40歲「老」程序員的反思
※淺談Java Xml底層解析方式
TAG:Java團長 |
※Go 中 JSON 的序列化和反序列化
※Python編程:序列化和反序列化
※Weblogic反序列化命令執行漏洞
※WebLogic WLS核心組件曝反序列化漏洞
※使用RedisTemplate(JDK序列化策略)緩存實體類
※利用fastjson反序列化json為對象和對象數組
※關於使用fastjson統一序列化響應格式
※NodeJS反序列化漏洞利用getshell
※Mozilla Rhino 反序列化漏洞 POC 分析
※Weblogic反序列化遠程代碼執行漏洞研究分析
※Oracle WebLogic Server反序列化遠程代碼執行漏洞成焦點
※MapReduce數據序列化讀寫概念淺析!
※通過小細節大幅改善 Django Rest 框架序列化性能
※用GDB調試PHP及反序列化小記
※FastJson反序列化漏洞利用的三個細節-TemplatesImpl利用鏈
※從微博motan看rpc基於netty4遠程通訊設計5-協議編解碼與序列化
※Hessian2ObjectInput.readObject : hessian 反序列化空指針異常
※PHP反序列化漏洞的新攻擊面
※千里眼可信主動免疫防護系統Weblogic反序列化漏洞防護方案
※服務化基石之遠程通信系列五:序列化協議之二進位序列化