序列化--Serializable與Parcelable

前言:

序列化:就是將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程javascript

在咱們平時開發中.咱們用到序列化最多的地方就是經過intent傳遞對象,若是你要在intent中傳遞基本數據類型之外的對象,那麼該對象必須實現Serializable或者Parcelable,不然會報錯java

注意:android

  • 1:經過intent傳遞過去的對象是通過了序列化與反序列化的,雖然傳送的對象和接收的對象內容相同,可是是不一樣的對象,他們的引用是不一樣的
  • 2:靜態變量是不會通過序列化的,因此跨進程通訊的時候靜態變量是傳送不過去的

1.Serializable


1.1 介紹

Serializable是java提供的序列化接口,使用起來特別簡單,你只用實現這個接口就可以讓這個對象支持序列化面試

public class Person implements Serializable{


}複製代碼

可是有一點要注意,就是你能夠添加一個字段,serialVersionUID緩存

private static final long serialVersionUID = 2387925265962719695L;複製代碼

若是你不添加serialVersionUID,也不會影響使用,可是存在即合理,既然存在這個字段,那麼他必定是有用的,當你序列化的時候這個UID會被寫入文件,當反序列話的時候會去讀取這個ID,並與反序列化的類中的UID對比,若是相同,那麼反序列化就成功,若是不一樣,反序列化就會失敗網絡

當你不指定UID的時候,系統會根據類的結構生成相應的hash值賦值給UID,可是當你的類的結構發生變化,好比增長一個字段或者減小一個字段的時候,UID就會發生變化,那麼反序列話的時候兩個類的UID就不同了,就會反序列化失敗ide

因此手動指定UID,主要就是在類結構發生變化時,減小反序列化失敗的概率(若是類發生了很是規的結構變化,好比類名變化,成員變量的類型變化,就算是指定了UID,反序列化也會失敗)工具


1.2序列化與反序列化

Serializable序列化與反序列化有不少種方法,這裏示範一下經過寫入文件和讀取文件來實現.優化

序列化: spa

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特有的序列化方式,他的實現相對Serialiable來講更加複雜一點,可是經過AS的一個插件就能夠很方便的完成

插件名稱: Android Parcelable Code Generator

當你完成對象的建立並實現Parcelable接口後,右鍵,選擇Generate,接着選擇Parcelable,並點擊你須要序列化的字段,點擊ok就完成可序列化了

這裏面的方法就不作詳細解析了,有興趣的朋友能夠去了解一下


(此截圖引用自Android開發藝術探索)

3.Serializable與Parcelable的對比

Serializable:

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

Parcelable:

  • 1.Parcelable是Android特有的可序列化接口
  • 2.Parcelable的效率比較高
  • 3.Parcleable實現起來比較複雜

4.使用場景

  • 1.Parcleable: 內存中的序列化時使用,效率更高
  • 2.Serializable: 對象序列化到存儲設備中、在網絡中傳輸等

熱門文章

相關文章
相關標籤/搜索