java序列化的方法_【Java常见序列化与反序列方法总结】
人和電腦在很多方面都是十分相似的,大腦可以看成電腦主機,五官/身體等表面器官就是顯示器、鼠標等外設。這篇文章就是想把計算機跟人做類比YY一下序列化和反序列化的機制、用途。
如果你是初學者,心里肯定會問究竟什么是序列化/反序列化?其實我現在正在雨林木風xp系統下載序列化而你正在反序列化:我在寫這篇博客的時候就是把大腦中的想法和思想經過梳理寫成連續的文字,這就是序列化,而你在讀這篇博客的時候把這些整理過的文字讀進大腦形成你自己的思想,這個過程就是反序列化。 我們可以把大腦中的想法通過文字或聲音傳遞,這樣有“共同語言”的人就能將這些文字,聲音"讀"進大腦形成自己的思想,這就是 人與人之間“溝通、交流”的過程;為了防止記憶丟失我們通常會把自己的一些想法、知識以文字形式或聲音進行“保存”。? 計算機中序列化的定義是:把對象轉換成數據流以便在網絡上進行傳輸,或者將對象持久的存儲在某個地方的過程;相反,反序列化是接收數據流轉換成對應的對象或從持久化存儲讀取數據轉換成對象的過程。簡單來說序列化就是用來做"有意義"的存儲或通信的。在Java中我們可以把一個對象序列化到網絡流,文件流,也可以序列化到字節數組等,然后可以從網絡流、文件流和字節數組等反序列化生成相應的對象。
上面已經提到序列化、反序列化主要用于對象的持久化存儲和遠程通信。尤其在分布式系統中,應用十分廣泛。
下面對Java默認實現的序列化機制做一個由淺入深的介紹。
a.首先是序列化機制的目標,下面是官方說明:
1.簡單且易于擴展;
2.序列化形式能夠保證Java對象類型信息和安全屬性信息不丟失;
3.方便擴展支持marshalling和unmarshalling,這是實現遠程對象的基礎;
4.易于擴展,能方便實現Java對象的持久化;
5.針對不同類的對象提供可定制的持久化方式;
6.允許對象定制自己的外部表示形式;
b. java默認提供的序列化機制:
1.序列化的基本步驟:
FileOutputStream fos = new FileOutputStream(outputFile)
1:ObjectOutputStream oos = new ObjectOutputStream(fos);
2:oos.writeObject(object);
3:oos.close();
第一步是創建一個對象輸出流oos,可以把對象序列化到文件、字節數組等,在構造oos時賦予不同類型的流參數即可。
在ObjectOutputStream的JDK實現中可以看出,構造oos對象時有安全管理器的校驗、設置流格式(包括設置流的頭信息:兩個MagicNumber)。
第二步就是寫入需要序列化的對象,這一步也是最為復雜的,包含了序列化機制的細節信息。
第三步關閉流。
第一步創建對象輸出流的時候,其實會初始化兩個Table:HandleTable和ReplaceTable,HandleTable主要是為了防止相同對象數據的重復寫入而設計。其中保存了原始對象到標志此對象index的映射,這樣碰到重復的對象時寫入的實際上是這個index而非原始對象數據。還可以對原始序列化對象進行替換,ReplaceTable用來保存被替換對象的信息。
序列化機制里面有很多細節值得去挖掘:
比如:1.Java中的引用到底是什么,而序列化對象的時候如何消除重復對象的保存。
2.對于cycle reference的情況又是如何處理的。
后面將做更加詳細的分析。
很多商業項目用到數據庫、內存映射文件和普通文件來完成項目中的序列化處理的需求,但是這些方法很少會依靠于Java序列化。本文也不是用來解釋序列化的,而是一起來看看面試中有關序列化的問題,這些問題你很有可能不了解?!癑ava序列化指的是將對象轉換程字節格式并將對象狀態保存在文件中,通常是.ser擴展名的文件。然后可以通過.ser文件重新創建Java對象,這個過程為返序列化”
Java序列化的API中提供了開發人員進行序列化對象的機制,通過Serializable和Externalizable接口。
一起看看這些問題:
1)Java中的Serializable接口和Externalizable接口有什么區別?
這個是面試中關于Java序列化問的最多的問題。我的回答是,Externalizable接口提供了兩個方法writeExternal()和readExternal()。這兩個方法給我們提供了靈活處理Java序列化的方法,通過實現這個接口中的兩個方法進行對象序列化可以替代Java中默認的序列化方法。正確的實現Externalizable接口可以大幅度的提高應用程序的性能。
2)Serializable接口中有借個方法?如果沒有方法的話,那么這么設計Serializable接口的目的是什么?
Serializable接口在java.lang包中,是Java序列化機制的核心組成部分。它里面沒有包含任何方法,我們稱這樣的接口為標識接口。如果你的類實現了Serializable接口,這意味著你的類被打上了“可以進行序列化”的標簽,并且也給了編譯器指示,可以使用序列化機制對這個對象進行序列化處理。
3)什么是serialVersionUID?如果你沒有定義serialVersionUID意味著什么?
SerialVersionUID應該是你的類中的一個public static final類型的常量,如果你的類中沒有定義的話,那么編譯器將拋出警告。如果你的類中沒有制定serialVersionUID,那么Java編譯器會根據類的成員變量和一定的算法生成用來表達對象的serialVersionUID ,通常是用來表示類的哈希值(hash code)。結論是,如果你的類沒有實現SerialVersionUID,那么如果你的類中如果加入或者改變成員變量,那么已經序列化的對象將無法反序列化。這是以為,類的成員變量的改變意味這編譯器生成的SerialVersionUID的值不同。Java序列化過程是通過正確SerialVersionUID來對已經序列化的對象進行狀態恢復。
總結
以上是生活随笔為你收集整理的java序列化的方法_【Java常见序列化与反序列方法总结】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java引入依赖aar,如何将JAR依赖
- 下一篇: java包含关系图_Java——Spri