淺談IPC通信之序列化與反序列化(三)

由于進行通信肯定要涉及數(shù)據(jù)的處理劲适,所以我們需要先了解兩個基礎(chǔ)的概念,序列化和反序列化酪捡。

定義

序列化:將對象轉(zhuǎn)化為可保存的字節(jié)序列(注意是對象)狞山;
反序列:將字節(jié)序列恢復(fù)為對象的過程纸泡。

序列化和反序列的用途:

1.以某種存儲形式使自定義對象序列化并永久的保存對象數(shù)據(jù)(將對象數(shù)據(jù)保存在文件當中,或者是磁盤中)陈症;
2.序列化對象的時候只是針對變量進行序列化,不針對方法進行序列化蔼水;
3.通過序列化操作將對象數(shù)據(jù)在網(wǎng)絡(luò)上進行傳輸(由于網(wǎng)絡(luò)傳輸是以字節(jié)流的方式對數(shù)據(jù)進行傳輸?shù)?因此序列化的目的是將對象數(shù)據(jù)轉(zhuǎn)換成字節(jié)流的形式);
4.通過序列化在進程間傳遞對象录肯;
5.Java平臺允許我們在內(nèi)存中創(chuàng)建可復(fù)用的Java對象趴腋,但一般情況下,只有當JVM處于運行時论咏,這些對象才可能存在优炬,即,這些對象的生命周期不會比JVM的生命周期更長(即每個對象都在JVM中)但在現(xiàn)實應(yīng)用中厅贪,就可能要停止JVM運行蠢护,但有要保存某些指定的對象,并在將來重新讀取被保存的對象养涮。這是Java對象序列化就能夠?qū)崿F(xiàn)該功能葵硕。(可選擇入數(shù)據(jù)庫、或文件的形式保存)贯吓;

序列化方式

Serializable

Serializable是Java提供的一個序列化接口懈凹,他是一個空接口,類實現(xiàn)該接口即可實現(xiàn)序列化宣决。
在實現(xiàn)Serializable時候蘸劈,編譯器會提示,讓我們添加serialVersionUID字段尊沸,該字段是一個關(guān)鍵的字段
相應(yīng)的實現(xiàn)好了威沫,那么如何寫入和讀取呢?
寫入:

public void writeSerializable() { 
      try { 
                // 構(gòu)造對象 
                Book book = new Book(); 
                // 構(gòu)造序列化輸出字節(jié)流 
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("xxx.txt")); 
                // 序列化對象 
                oos.writeObject(book); 
                // 關(guān)閉流 oos.close(); 
          } catch (Exception e) { 
                e.printStackTrace(); 
          } 
}

讀韧葑ā:

public void readSerializable() { 
      try { 
                // 創(chuàng)建序列化讀取字節(jié)流 
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "xxx.txt"));
                // 反序列化(讀劝袈印)對象 
                Book book = (Book) ois.readObject(); 
                // 關(guān)閉流 ois.close();
         } catch (Exception e) { 
                e.printStackTrace(); 
        } 
}

在序列化時,如果我們序列化對象之后屁商,改變了我們的類結(jié)構(gòu)(添加或改變字段)烟很,甚至是修改了字段的類型,修改了類名蜡镶,那么我們能反序列化成功嗎雾袱。那么關(guān)鍵就在于serialVersionUID字段。

如果我們不指定的話官还。在序列化時芹橡,會計算當前類結(jié)構(gòu)的hash值并賦給serialVersionUID,當反序列時望伦,會比對該值是否相同林说,如果不相同煎殷,則無法序列化成功。

我們也可以手動指定腿箩,手動指定的好處是在類結(jié)構(gòu)發(fā)生變化時豪直,能夠最大程度的反序列,當然前提是只是刪除或添加了字段珠移,如果是變量類型發(fā)生了變化弓乙,則依然無法反序列成功。

serialVersionUID 的工作機制:

序列化時系統(tǒng)會把當前類的serialVersionUID寫入序列化文件中钧惧,當反序列化時候系統(tǒng)會去檢測文件中的serialVersionUID,看它是否和當前類的serialVersionUID一致唆貌,如果一致說明序列化類的版本和當前類的版本是相同的,這個時候可以成功反序列化垢乙,否則就說明當前類和序列化的類相比發(fā)生了某些變化锨咙。所以,我們最好指定serialVersionUID追逮,避免他自定生成酪刀。

Parcelable

Parcelable是Android中特有的一種序列化方式,在intent傳值時钮孵,通常使用該方式骂倘。該方式實現(xiàn)序列化,依然實現(xiàn)Parcelable巴席,然后實現(xiàn)一些該接口的方法历涝。

Parcelable實現(xiàn)兩個方法,創(chuàng)建一個字段:

實現(xiàn)describeContents():返回當前對象的內(nèi)容描述漾唉。幾乎所有情況下都是返回0荧库。

實現(xiàn)public void writeToParcel(Parcel dest, int flags):將當前對象寫入到序列化結(jié)構(gòu)中

構(gòu)造Parcelable.Creator字段,該對象需要實現(xiàn)兩個方法:
public Book createFromParcel(Parcel source):從序列化后的對象中創(chuàng)建原始的值赵刑。
public Book[] newArray(int size):創(chuàng)建指定長度的原始對象數(shù)組分衫。

Serializable和Parcelable的比較

1.Serializable是Java中的序列化接口,其使用起來簡單但是開銷較大般此,序列化和反序列化需要大量的I/O操作蚪战。
2.Parcelable是Android中的序列化方式,更適用于Android的平臺上铐懊,他的缺點是使用起來稍微麻煩邀桑,但是效率很高。
3.Parcelable適合進程間的通信科乎,運行期壁畸。Serializable適合文件存儲即網(wǎng)絡(luò)傳輸。
4.Serializable序列化不保存靜態(tài)變量喜喂,可以使用Transient關(guān)鍵字對部分字段不進行序列化瓤摧,也可以覆蓋writeObject、readObject方法以實現(xiàn)序列化過程自定義
5.內(nèi)存間數(shù)據(jù)傳輸時推薦使用Parcelable玉吁,如activity間傳輸數(shù)據(jù)照弥,而Serializable可將數(shù)據(jù)持久化方便保存,所以在需要保存或網(wǎng)絡(luò)傳輸數(shù)據(jù)時選擇Serializable

參考

Android IPC 進程間通信

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末进副,一起剝皮案震驚了整個濱河市这揣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌影斑,老刑警劉巖给赞,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矫户,居然都是意外死亡片迅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門皆辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柑蛇,“玉大人,你說我怎么就攤上這事驱闷〕芴ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵空另,是天一觀的道長盆耽。 經(jīng)常有香客問我,道長扼菠,這世上最難降的妖魔是什么摄杂? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮循榆,結(jié)果婚禮上匙姜,老公的妹妹穿的比我還像新娘。我一直安慰自己冯痢,他們只是感情好氮昧,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浦楣,像睡著了一般袖肥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上振劳,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天椎组,我揣著相機與錄音,去河邊找鬼历恐。 笑死寸癌,一個胖子當著我的面吹牛专筷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸苇,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼磷蛹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溪烤?” 一聲冷哼從身側(cè)響起味咳,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檬嘀,沒想到半個月后槽驶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡鸳兽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年掂铐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揍异。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡堡纬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒿秦,到底是詐尸還是另有隱情烤镐,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布棍鳖,位于F島的核電站炮叶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渡处。R本人自食惡果不足惜镜悉,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望医瘫。 院中可真熱鬧侣肄,春花似錦、人聲如沸醇份。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僚纷。三九已至矩距,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怖竭,已是汗流浹背锥债。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哮肚。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓登夫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親允趟。 傳聞我的和親對象是個殘疾皇子恼策,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容

  • JAVA序列化機制的深入研究 對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整...
    時待吾閱讀 10,872評論 0 24
  • Android跨進程通信IPC整體內(nèi)容如下 1、Android跨進程通信IPC之1——Linux基礎(chǔ)2拼窥、Andro...
    隔壁老李頭閱讀 11,864評論 6 38
  • What? 何為序列化與反序列化蹋凝?序列化:將對象轉(zhuǎn)化為二進制序列的過程反序列化:將二進制序列恢復(fù)為原始對象的過程 ...
    LilacZiyun閱讀 3,004評論 0 15
  • 官方文檔理解 要使類的成員變量可以序列化和反序列化鲁纠,必須實現(xiàn)Serializable接口。任何可序列化類的子類都是...
    獅_子歌歌閱讀 2,414評論 1 3
  • 如果你只知道實現(xiàn) Serializable 接口的對象鳍寂,可以序列化為本地文件改含。那你最好再閱讀該篇文章,文章對序列化...
    jiangmo閱讀 481評論 0 2