android 如何優化數據存儲

  將特定結構的數據轉化爲一種能被記錄和還原的格式即存儲java

  數據存儲的六個關鍵因素:正確性、時間開銷、空間開銷、安全、開發成本和兼容性。咱們不可能同時把全部要素都作到最好,所謂數據存儲優化就是根據本身的使用場景去把其中的一項或者幾項作到最好。數組

  更寬泛的講,存儲不必定就是將數據存放在磁盤中,好比放到內存中、經過網絡傳輸也算是存儲的一種形式。或者咱們也能夠把這個過程叫作對象或者數據的序列化。安全

對於大部分的開發者來講,咱們不必定有精力去創造一種數據序列化的格式,Android經常使用的序列化方法如何進行選擇。網絡

  對象的序列化函數

  應用程序中的對象存儲在內存中,若是咱們想把對象存儲下來或者在網絡上傳輸,這個時候就須要用到對象的序列化和反序列化。性能

  對象序列化就是把一個Object對象全部的信息都表示成一個字節序列,包括Class信息、繼承關係信息、訪問權限、變量類型以及數值信息等。優化

  1.Serializable編碼

  Serializable是java原生的序列化機制,在Android中也有被普遍使用,咱們能夠經過Serializable將對象持久化存儲,也可經過Bundle傳遞Serializable序列化數據。加密

  Serializable的原理設計

  Serializable原理是經過ObjectInputStream和ObjectOutputStream來實現的,咱們以Android6.0源碼爲例,部分ObjectOutputStream的源碼實現

  

  整個序列化過程使用了大量的反射和臨時變量,並且在序列化對象的時候,不只會序列化當前對象自己,還須要遞歸序列化對象引用的其餘對象

  整個過程計算很是複雜,並且由於存在大量反射和GC的影響,序列化的性能會比較差。另一方面由於序列化文件須要包含的信息很是多,致使它的大小比Class文件自己還要大不少,這樣會致使I/O讀寫的性能問題。

  Serializable的進階

  既然Serializable性能那麼差,那它有什麼優點嗎

  一、writeObject和readObject方法。Serializable序列化支持替代默認流程,它會先反射判斷是否存在咱們事先的序列化方法writeObject或反序列化方法readObject,經過這兩個方法,咱們能夠對某些字段作一些特殊修改,也能夠實現序列化的加密功能。

  2.writeReplace和readResolve方法。這兩個方法代理序列化的對象,能夠實現自定義返回的序列化實例。咱們能夠經過它們實現對象序列化的版本兼容,例如經過readResolve方法能夠把老版本的序列化對象轉換成新版本的對象類型。

  Serializable的序列化與反序列化調用流程以下

 

  Serializable的注意事項

  Serializable雖然使用很是簡單,可是也有必定須要注意的事項選段

  1.不被序列化字段。類的static變量以及被聲明爲transient的字段,默認的序列化機制都會忽略該字段,不會進行序列化存儲。

  2.SerialVersionUID 在類實現Serializable接口後,咱們須要添加一個SerialVersionID,它至關於類的版本號,這個ID咱們能夠顯式聲明也可讓編譯器本身計算。一般我建議顯示聲明會更加穩妥,由於顯式聲明假如類發生一點點變化,進行反序列化都會因爲serialVersionUID改變而致使InvalidClassException異常

  3.構造方法。Serializable的反序列默認是不會執行構造函數的,它是根據數據流中對Object的描述信息建立對象的,若是一些邏輯依賴構造函數,就可能出現問題,例如一個靜態變量只在構造函數中賦值,固然咱們也能夠經過進階方法作自定義的反序列化修改

  Parcelable

  因爲Java的Serializable的性能較低,Android須要從新設計一套更加輕量且高效的對象序列化和反序列化機制,Parcelable正是在這個背景下產生的,它核心的做用就是爲了解決Android中跨進程通訊的性能問題。

  Parcelable只會在內存中進行序列化操做,並不會將數據存儲在磁盤裏

  固然能夠經過marshall接口獲取byte數組,而後存在文件中從而實現Parcelable的永久存儲。

  Parcelable的注意事項

  在時間開銷和使用成本的權衡上,Parcelable機制選擇的是性能優先

  因此它在寫入和讀取的時候都須要手動添加自定義代碼,使用起來相比Serializable會複雜不少,可是正由於這樣,Parcelable纔不須要採起反射的方式去實現序列化和反序列化。

  雖然能夠經過取巧的方法實現Parcelable的永久存儲,可是它存在兩個問題

  1.系統版本的兼容性。因爲Parcelable設計本意是在內存中使用,咱們沒法保證Android版本Parcel.cpp實現都徹底一致,若是不一樣版本實現有所差別,或者有廠商修改了實現,可能存在問題

  2.數據先後兼容性。Parcelablel並無版本管理的設計,若是咱們類的版本出現升級,寫入的順序以及字段類型的兼容都須要格外注意,這也帶來了很大的維護成本

  通常來講,若是須要持久化存儲的話,通常仍是不得不選擇性能更差的Serializable方案

  Serial

  三方性能更優

  數據的序列化

  對象的序列化要記錄的信息仍是比較多,在操做比較頻繁的時候,對應用的影響仍是很多的,這個時候咱們能夠選擇使用數據的序列化

  1.JSON

  JSON是一種輕量級的數據交互格式,它被普遍使用在網絡傳輸中,不少應用於服務端的通訊都是使用JSON格式進行交互

  優點

  1.相比對象序列化方案,速度更快,體積更小

  2.相比二進制的序列化方案,結果可讀,易於排查問題

  3.使用方便、支持跨平臺、跨語言、支持嵌套引用

  2.Protocal Buffers

  相比對象序列化方案,JSON的速度更快、體積更小,不過爲了保證JSON的中間結果是可讀的,它並無作二進制的壓縮,也所以JSON的性能尚未達到極致。

  若是應用的數據量很是大,又或者對性能有更高的要求,此時Protocal Buffers是一個很是好的選擇,它是Google開源的跨語言編碼協議,Google內部的幾乎全部RPC都在使用這個協議  

  存儲監控

隨後補上

相關文章
相關標籤/搜索