當(dāng)我們說到序列化,你需要知道什么?

前言:

序列化:就是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程

在我們平時開發(fā)中.我們用到序列化最多的地方就是通過intent傳遞對象,如果你要在intent中傳遞基本數(shù)據(jù)類型以外的對象,那么該對象必須實現(xiàn)Serializable或者Parcelable,否則會報錯

注意:

  • 1:通過intent傳遞過去的對象是經(jīng)過了序列化與反序列化的,雖然傳送的對象和接收的對象內(nèi)容相同,但是是不同的對象,他們的引用是不同的
  • 2:靜態(tài)變量是不會經(jīng)過序列化的,所以跨進(jìn)程通信的時候靜態(tài)變量是傳送不過去的

1.Serializable


1.1 介紹

Serializable是java提供的序列化接口,使用起來特別簡單,你只用實現(xiàn)這個接口就能夠讓這個對象支持序列化

public class Person implements Serializable{

   
}

但是有一點(diǎn)要注意,就是你可以添加一個字段,serialVersionUID

private static final long serialVersionUID = 2387925265962719695L;

如果你不添加serialVersionUID,也不會影響使用,但是存在即合理,既然存在這個字段,那么他一定是有用的,當(dāng)你序列化的時候這個UID會被寫入文件,當(dāng)反序列話的時候會去讀取這個ID,并與反序列化的類中的UID對比,如果相同,那么反序列化就成功,如果不同,反序列化就會失敗

當(dāng)你不指定UID的時候,系統(tǒng)會根據(jù)類的結(jié)構(gòu)生成相應(yīng)的hash值賦值給UID,但是當(dāng)你的類的結(jié)構(gòu)發(fā)生變化,比如增加一個字段或者減少一個字段的時候,UID就會發(fā)生變化,那么反序列話的時候兩個類的UID就不一樣了,就會反序列化失敗

所以手動指定UID,主要就是在類結(jié)構(gòu)發(fā)生變化時,減少反序列化失敗的幾率(如果類發(fā)生了非常規(guī)的結(jié)構(gòu)變化,比如類名變化,成員變量的類型變化,就算是指定了UID,反序列化也會失敗)


1.2序列化與反序列化

Serializable序列化與反序列化有很多種方法,這里示范一下通過寫入文件和讀取文件來實現(xiàn).

序列化:

File file = new File(getFilesDir()+"xiayu.txt");
Person             person       = new Person("xiayu");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(person);

反序列化:

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(getFilesDir()+"xiayu.txt"));
Person            person                 = (Person) objectInputStream.readObject();

2.Parcelable

Parcelable是Android特有的序列化方式,他的實現(xiàn)相對Serialiable來說更加復(fù)雜一點(diǎn),但是通過AS的一個插件就可以很方便的完成

插件名稱: Android Parcelable Code Generator

當(dāng)你完成對象的創(chuàng)建并實現(xiàn)Parcelable接口后,右鍵,選擇Generate,接著選擇Parcelable,并點(diǎn)擊你需要序列化的字段,點(diǎn)擊ok就完成可序列化了

這里面的方法就不做詳細(xì)解析了,有興趣的朋友可以去了解一下


(此截圖引用自Android開發(fā)藝術(shù)探索)

3.Serializable與Parcelable的對比

Serializable:

  • 1.Serializable是java提供的可序列化接口
  • 2.Serializable的序列化與反序列化需要大量的IO操作,效率比較低
  • 3.Serializable實現(xiàn)起來很簡單

Parcelable:

  • 1.Parcelable是Android特有的可序列化接口
  • 2.Parcelable的效率比較高
  • 3.Parcleable實現(xiàn)起來比較復(fù)雜

4.使用場景

  • 1.Parcleable: 內(nèi)存中的序列化時使用,效率更高
  • 2.Serializable: 對象序列化到存儲設(shè)備中、在網(wǎng)絡(luò)中傳輸?shù)?/strong>

熱門文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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