Java中的序列化-創(chuàng)新互聯

什么是序列化?序列化有什么作用?
一、序列化與反序列化
序列化 (Serialization)是將對象的狀態(tài)信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。
序列化使其他代碼可以查看或修改,那些不序列化便無法訪問的對象實例數據。確切地說,代碼執(zhí)行序列化需要特殊的權限:即指定了 SerializationFormatter 標志的 SecurityPermission。在默認策略下,通過 Internet 下載的代碼或 Internet 代碼不會授予該權限;只有本地計算機上的代碼才被授予該權限。
通常,對象實例的所有字段都會被序列化,這意味著數據會被表示為實例的序列化數據。這樣,能夠解釋該格式的代碼有可能能夠確定這些數據的值,而不依賴于該成員的可訪問性。
類似地,反序列化從序列化的表示形式中提取數據,并直接設置對象狀態(tài),這也與可訪問性規(guī)則無關。
對于任何可能包含重要的安全性數據的對象,如果可能,應該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定字段來保存不可序列化的重要數據。如果無法實現這一點,則應注意該數據會被公開給任何擁有序列化權限的代碼,并確保不讓任何惡意代碼獲得該權限。
------------------------- 百度百科上面的解釋
我覺得挺好的,我看了很多篇博客,都說的模棱兩可,說指堆內存中的java對象數據,通過某種方式把對象存儲到磁盤文件中,或者傳遞給其他網絡節(jié)點(網絡傳輸)。
說序列化就是把對象存儲到磁盤中,我認為這種應該叫做數據持久化,不是叫做序列化。 java對象不能直接存儲到磁盤中,或不能直接在網絡上傳輸,需要轉化成另一種格式才能,而序列化就是把java對象轉化成一種格式的過程,把java對象序列化,變成一種可以存儲的形式。

成都創(chuàng)新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站建設、網站建設、儀征網絡推廣、微信小程序定制開發(fā)、儀征網絡營銷、儀征企業(yè)策劃、儀征品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯為所有大學生創(chuàng)業(yè)者提供儀征建站搭建服務,24小時服務熱線:028-86922220,官方網址:muchs.cn

序列化的作用:
1:對象隨著程序的運行而被創(chuàng)建,然后在不可達時被回收,生命周期是短暫的。但是如果我們想長久地把對象的內容保存起來怎么辦呢?把它轉化為字節(jié)序列保存在存儲介質上即可。那就需要序列化。
2:所有可在網絡上傳輸的對象都必須是可序列化的,比如RMI(remote method invoke,即遠程方法調用),傳入的參數或返回的對象都是可序列化的,否則會出錯;所有需要保存到磁盤的java對象都必須是可序列化的。通常建議:程序創(chuàng)建的每個JavaBean類都實現Serializeable接口
3:進程間傳遞對象,Android是基于Linux系統(tǒng),不同進程之間的java對象是無法傳輸,所以我們此處要對對象進行序列化,從而實現對象在 應用程序進程 和 ActivityManagerService進程 之間傳輸。

序列化的實現:
1:實現Sericalizable接口,實現Sericalizable接口的時候還要寫一個SericalizableUID,這個是版本號,JVM會把傳進來的字節(jié)流中的serialVersionUID與本地實體類中的serialVersionUID進行比較,如果相同則認為是一致的,便可以進行反序列化,否則就會報序列化版本不一致的異常。如果實現接口的時候,沒有給定UID,就會使用默認的UID,當使用默認的UID的時候,jvm每次編譯的時候會生成一個UID,當后面程序改了一些代碼,再次編譯的時候會生成不同的UID,會導致反序列化失敗!所以在實現Sericalizable接口的時候,我們自己給定一個固定的UID值,這樣就能保證編譯完再 反序列化的時候的版本一致性。所以j能不能成功反序列化,就是看對象中的UID和實體中UID是否一致。
2:實現Externalnalizable接口,在類中實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,在方法中定義類對象自定義的序列化和反序列化操作。這樣通過對象輸出流和對象輸入流的輸入輸出方法序列化和反序列化對象時會自動調用類中定義的readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法。

對象的實現序列順序:
  當前類描述的元數據輸出為字節(jié)序列;【類定義描述、類中屬性定義描述】

超類描述輸出為字節(jié)序列;【如果超類還有超類,則依次遞歸,直至沒有超類】

從最頂層超類往下,依次輸出各類屬性值描述,直至當前類對象屬性值。

即:從下到上描述類定義,從上往下輸出屬性值。

當靜態(tài)變量和transient關鍵字修飾的變量不能被序列化;

反序列化時要按照序列化的順序重構對象:如先序列化A后序列化B,則反序列化時也要先獲取A后獲取B,否則報錯。

序列化漏洞:
反序列化是一系列安全問題的根源:攻擊者能夠將惡意數據序列化并存儲到數據庫或內存中,當應用進行反序列化時,應用會執(zhí)行到惡意代碼。

在谷歌內部,這個缺陷被稱為“瘋狂的小部件 (Mad Gadget)”,外界對它的叫法是 “Java 啟示錄 (Apocalypse)”。

所以有一系列的規(guī)范來大化避免:

1)對序列化對象執(zhí)行完整性檢查或加密,以防止惡意對象創(chuàng)建或數據篡改;最常見的例子之一就是JWT:JWT由3部分組成:Header,Payload,Verify Signature,最后的簽名部分其實就是對數據進行完整性校驗的關鍵部分,用secret對數據部分進行哈希計算,隨后檢查計算出來的哈希值是否和請求中的JWT簽名部分的哈希值相同。若兩者一致則認為數據完整性沒有被破壞,若兩者有差異則說明數據被修改過。

2)在創(chuàng)建對象之前強制執(zhí)行嚴格的類型約束;

3)隔離反序列化的代碼,使其在非常低的特權環(huán)境中運行;

4)記錄反序列化的例外情況和失敗信息,如:傳入的類型不是預期的類型,或者反序列處理引發(fā)的例外情況;

5)限制或監(jiān)視來自于容器或服務器傳入和傳出的反序列化網絡連接;

6)監(jiān)視反序列化,當用戶持續(xù)進行反序列化時,對用戶進行警告。

目前JAVA常用的序列化有protobuf,json,xml,Serializable,hessian,kryo。

protobuf:谷歌公司出的一款開源項目,轉碼性能高,支持多語言;

JSON:用途最廣泛,序列化方式還衍生了阿里的fastjson,美團的MSON,谷歌的GSON等更加優(yōu)秀的轉碼工具。
  優(yōu)點:使用方便。
  缺點:數據冗長,轉碼性能一般。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

文章題目:Java中的序列化-創(chuàng)新互聯
URL網址:http://muchs.cn/article10/degjgo.html

成都網站建設公司_創(chuàng)新互聯,為您提供企業(yè)網站制作企業(yè)建站、品牌網站制作、服務器托管、面包屑導航、網站制作

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

搜索引擎優(yōu)化