Android中的Serializable、Parcelable

      網友投稿 680 2025-04-08

      Parcelable


      這是一個接口,它的實例可以寫入Parcel或從Parcel恢復。實現Parcelable的類必須要有一個實現了Parcelable.Creator接口的類型的非空靜態字段CREATOR,這個字段是幫忙從一個Parcel產生一個Parcelable類的實例。

      public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      describeContents()用于描述Parcelable類實例的

      writeToParcel(Parcel dest, int flags)用于將數據扁平化寫入Parcel

      Parcel是一個消息(數據或對象引用)容器,它可以通過IBinder來發送,也就是說 Parcelable實例十分合適作來進程間通信的消息載體。

      在java中使用Serializable接口實現對象的序列化,而在android中既可以使用Serializable也可以使用Parcelable接口實現對象序列化,如果只在內存操作時則傾向Parcelable接口,傳輸效率會更高效。

      注意:Parcelable只能對內存對象序列化,不能對需要存儲在文件或SD等設備進行序列化,如果需要將對象序列化存儲到文件,實現Serializable接口就可以了

      Serializable是java提供的一個序列化接口,它是一個空接口,專門為對象提供標準的序列化和反序列化操作,用它實現類的序列化比較簡單,只要在類聲明中實現Serializable接口即可。

      public class User implements Serializable { private static final long serialVersionUID = -4454266436543306544L; private String name; /** * age */ private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      由于serialVersionUID是用來輔助序列化和反序列化過程的,原則上序列化后的對象中serialVersionUID只有和當前類的serialVersionUID相同才能夠正常被反序列化,也就是說序列化與反序列化的serialVersionUID必須相同才能夠使序列化操作成功。序列化操作的時候系統會把當前類的serialVersionUID寫入到序列化文件中,當反序列化時系統會去檢測文件中的serialVersionUID,判斷它是否與當前類的serialVersionUID一致,如果一致就說明序列化類的版本與當前類版本是一樣的,可以反序列化成功,否則失敗。因此強烈建議指定serialVersionUID,這樣的話即使微小的變化也不會導致crash的出現,否則文件多一個空格或類的結構有些許變化都會反序列化失敗。默認情況下,系統會根據類結構自動生成的serialVersionUID,因此當類稍有變化,自動生成的UID就會與之前存在文件中的不一樣,就會反序列化失敗。因此有必要指定serialVersionUID,那么系統就會盡可能地序列化。

      需要注意的是如果反序列的類的成員變量的類型或者類名發生了變化,即使serialVersionUID相同反序列化會失敗。其次是靜態成員變量屬于類不屬于對象,不會參與序列化過程,使用transient關鍵字標記的成員變量也不參與序列化過程。

      Android中的Serializable、Parcelable

      Serializable在內存序列化是(將數據持久化在磁盤)上開銷比較大,如Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC(垃圾回收),而內存資源對于android系統來說是十分稀有的(首先,我們每個應用都會運行在各自的虛擬機上,而android系統分配給每個虛擬機的內存開銷都是十分有限的)。因此android中提供了Parcelable接口來實現序列化操作,Parcelable的性能比Serializable好,在內存開銷方面較小,所以在內存間數據傳輸時推薦使用Parcelable,如通過Intent在activity間傳輸數據,進程間通信也推薦使用Parcelable

      Android Parcel

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:設置嵌入式對象動作
      下一篇:模板有背景音樂,但是通過選擇窗格并沒有找到此音樂,如何刪除
      相關文章
      男人天堂2018亚洲男人天堂| 亚洲精品综合久久中文字幕| 亚洲免费在线视频观看| 亚洲国产精品一区二区第一页| 亚洲成人影院在线观看| 亚洲av无码专区在线电影天堂| 国产精品亚洲午夜一区二区三区| 亚洲w码欧洲s码免费| 亚洲一区动漫卡通在线播放| 亚洲国产成人精品电影| 亚洲专区一路线二| 国产精品高清视亚洲精品| 亚洲av无码国产综合专区| youjizz亚洲| 亚洲日韩久久综合中文字幕| 亚洲综合一区无码精品| 亚洲精品欧美综合四区| 国产成人精品日本亚洲语音 | 亚洲国产精品人人做人人爱| 99亚洲乱人伦aⅴ精品| 偷自拍亚洲视频在线观看99| 亚洲成av人在线观看网站| 亚洲精品女同中文字幕| 国产精品亚洲精品日韩电影| 国内成人精品亚洲日本语音| 亚洲国产av无码精品| 亚洲AV伊人久久青青草原| 亚洲午夜国产片在线观看| 亚洲精品A在线观看| 激情97综合亚洲色婷婷五| 亚洲国产精品va在线播放| 亚洲人成亚洲精品| 亚洲国产av美女网站| 亚洲中文字幕久久精品无码VA| 久久亚洲中文字幕无码| 亚洲色偷拍区另类无码专区| 国产亚洲A∨片在线观看| 色噜噜综合亚洲av中文无码| 亚洲人和日本人jizz| 亚洲国产精品无码久久久秋霞1| 午夜亚洲av永久无码精品|