前言:
序列化:就是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程
在我們平時(shí)開發(fā)中.我們用到序列化最多的地方就是通過intent傳遞對(duì)象,如果你要在intent中傳遞基本數(shù)據(jù)類型以外的對(duì)象,那么該對(duì)象必須實(shí)現(xiàn)Serializable或者Parcelable,否則會(huì)報(bào)錯(cuò)
注意:
- 1:通過intent傳遞過去的對(duì)象是經(jīng)過了序列化與反序列化的,雖然傳送的對(duì)象和接收的對(duì)象內(nèi)容相同,但是是不同的對(duì)象,他們的引用是不同的
- 2:靜態(tài)變量是不會(huì)經(jīng)過序列化的,所以跨進(jìn)程通信的時(shí)候靜態(tài)變量是傳送不過去的
1.Serializable
1.1 介紹
Serializable是java提供的序列化接口,使用起來特別簡(jiǎn)單,你只用實(shí)現(xiàn)這個(gè)接口就能夠讓這個(gè)對(duì)象支持序列化
public class Person implements Serializable{
}
但是有一點(diǎn)要注意,就是你可以添加一個(gè)字段,serialVersionUID
private static final long serialVersionUID = 2387925265962719695L;
如果你不添加serialVersionUID,也不會(huì)影響使用,但是存在即合理,既然存在這個(gè)字段,那么他一定是有用的,當(dāng)你序列化的時(shí)候這個(gè)UID會(huì)被寫入文件,當(dāng)反序列話的時(shí)候會(huì)去讀取這個(gè)ID,并與反序列化的類中的UID對(duì)比,如果相同,那么反序列化就成功,如果不同,反序列化就會(huì)失敗
當(dāng)你不指定UID的時(shí)候,系統(tǒng)會(huì)根據(jù)類的結(jié)構(gòu)生成相應(yīng)的hash值賦值給UID,但是當(dāng)你的類的結(jié)構(gòu)發(fā)生變化,比如增加一個(gè)字段或者減少一個(gè)字段的時(shí)候,UID就會(huì)發(fā)生變化,那么反序列話的時(shí)候兩個(gè)類的UID就不一樣了,就會(huì)反序列化失敗
所以手動(dòng)指定UID,主要就是在類結(jié)構(gòu)發(fā)生變化時(shí),減少反序列化失敗的幾率(如果類發(fā)生了非常規(guī)的結(jié)構(gòu)變化,比如類名變化,成員變量的類型變化,就算是指定了UID,反序列化也會(huì)失敗)
1.2序列化與反序列化
Serializable序列化與反序列化有很多種方法,這里示范一下通過寫入文件和讀取文件來實(shí)現(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特有的序列化方式,他的實(shí)現(xiàn)相對(duì)Serialiable來說更加復(fù)雜一點(diǎn),但是通過AS的一個(gè)插件就可以很方便的完成
插件名稱: Android Parcelable Code Generator
當(dāng)你完成對(duì)象的創(chuàng)建并實(shí)現(xiàn)Parcelable接口后,右鍵,選擇Generate,接著選擇Parcelable,并點(diǎn)擊你需要序列化的字段,點(diǎn)擊ok就完成可序列化了
這里面的方法就不做詳細(xì)解析了,有興趣的朋友可以去了解一下
(此截圖引用自Android開發(fā)藝術(shù)探索)
3.Serializable與Parcelable的對(duì)比
Serializable:
- 1.Serializable是java提供的可序列化接口
- 2.Serializable的序列化與反序列化需要大量的IO操作,效率比較低
- 3.Serializable實(shí)現(xiàn)起來很簡(jiǎn)單
Parcelable:
- 1.Parcelable是Android特有的可序列化接口
- 2.Parcelable的效率比較高
- 3.Parcleable實(shí)現(xiàn)起來比較復(fù)雜
4.使用場(chǎng)景
- 1.Parcleable: 內(nèi)存中的序列化時(shí)使用,效率更高
- 2.Serializable: 對(duì)象序列化到存儲(chǔ)設(shè)備中婆殿、在網(wǎng)絡(luò)中傳輸?shù)?/strong>