国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Serializable和Parcelable序列化對象詳解

2020-04-11 10:45:22
字體:
來源:轉載
供稿:網友

本文詳細對Android中Serializable和Parcelable序列化對象進行學習,具體內容如下

學習內容:

1.序列化的目的

2.Android中序列化的兩種方式

3.Parcelable與Serializable的性能比較

4.Android中如何使用Parcelable進行序列化操作

5.Parcelable的工作原理

6.相關實例

 1.序列化的目的

 1).永久的保存對象數據(將對象數據保存在文件當中,或者是磁盤中

  2).通過序列化操作將對象數據在網絡上進行傳輸(由于網絡傳輸是以字節流的方式對數據進行傳輸的.因此序列化的目的是將對象數據轉換成字節流的形式)

  3).將對象數據在進程之間進行傳遞(Activity之間傳遞對象數據時,需要在當前的Activity中對對象數據進行序列化操作.在另一個Activity中需要進行反序列化操作講數據取出)

  4).Java平臺允許我們在內存中創建可復用的Java對象,但一般情況下,只有當JVM處于運行時,這些對象才可能存在,即,這些對象的生命周期不會比JVM的生命周期更長(即每個對象都在JVM中)但在現實應用中,就可能要停止JVM運行,但有要保存某些指定的對象,并在將來重新讀取被保存的對象。這是Java對象序列化就能夠實現該功能。(可選擇入數據庫、或文件的形式保存)

  5).序列化對象的時候只是針對變量進行序列化,不針對方法進行序列化.

  6).在Intent之間,基本的數據類型直接進行相關傳遞即可,但是一旦數據類型比較復雜的時候,就需要進行序列化操作了.

2.Android中實現序列化的兩種方式
1).Implements Serializable 接口 (聲明一下即可)
Serializable 的簡單實例:

public class Person implements Serializable{ private static final long serialVersionUID = -7060210544600464481L; private String name; private int age;  public String getName(){  return name; }  public void setName(String name){  this.name = name; }  public int getAge(){  return age; }  public void setAge(int age){  this.age = age; }}

2).Implements Parcelable 接口(不僅僅需要聲明,還需要實現內部的相應方法)
Parcelable的簡單實例:

注:寫入數據的順序和讀出數據的順序必須是相同的.

public class Book implements Parcelable{ private String bookName; private String author; private int publishDate;  public Book(){   }  public String getBookName(){  return bookName; }  public void setBookName(String bookName){  this.bookName = bookName; }  public String getAuthor(){  return author; }  public void setAuthor(String author){  this.author = author; }  public int getPublishDate(){  return publishDate; }  public void setPublishDate(int publishDate){  this.publishDate = publishDate; }  @Override public int describeContents(){  return 0; }  @Override public void writeToParcel(Parcel out, int flags){  out.writeString(bookName);  out.writeString(author);  out.writeInt(publishDate); }  public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>(){       @Override  public Book[] newArray(int size){   return new Book[size];  }    @Override  public Book createFromParcel(Parcel in){   return new Book(in);  } };  public Book(Parcel in){  //如果元素數據是list類型的時候需要: lits = new ArrayList<?> in.readList(list); 否則會出現空指針異常.并且讀出和寫入的數據類型必須相同.如果不想對部分關鍵字進行序列化,可以使用transient關鍵字來修飾以及static修飾.  bookName = in.readString();  author = in.readString();  publishDate = in.readInt(); }}

  我們知道在Java應用程序當中對類進行序列化操作只需要實現Serializable接口就可以,由系統來完成序列化和反序列化操作,但是在Android中序列化操作有另外一種方式來完成,那就是實現Parcelable接口.也是Android中特有的接口來實現類的序列化操作.原因是Parcelable的性能要強于Serializable.因此在絕大多數的情況下,Android還是推薦使用Parcelable來完成對類的序列化操作的.

3.Parcelable與Serializable的性能比較

首先Parcelable的性能要強于Serializable的原因我需要簡單的闡述一下

  1). 在內存的使用中,前者在性能方面要強于后者

  2). 后者在序列化操作的時候會產生大量的臨時變量,(原因是使用了反射機制)從而導致GC的頻繁調用,因此在性能上會稍微遜色

  3). Parcelable是以Ibinder作為信息載體的.在內存上的開銷比較小,因此在內存之間進行數據傳遞的時候,Android推薦使用Parcelable,既然是內存方面比價有優勢,那么自然就要優先選擇.

  4). 在讀寫數據的時候,Parcelable是在內存中直接進行讀寫,而Serializable是通過使用IO流的形式將數據讀寫入在硬盤上.

  但是:雖然Parcelable的性能要強于Serializable,但是仍然有特殊的情況需要使用Serializable,而不去使用Parcelable,因為Parcelable無法將數據進行持久化,因此在將數據保存在磁盤的時候,仍然需要使用后者,因為前者無法很好的將數據進行持久化.(原因是在不同的Android版本當中,Parcelable可能會不同,因此數據的持久化方面仍然是使用Serializable)

  速度測試:

  測試方法:

1)、通過將一個對象放到一個bundle里面然后調用Bundle#writeToParcel(Parcel, int)方法來模擬傳遞對象給一個activity的過程,然后再把這個對象取出來。

2)、在一個循環里面運行1000 次。

3)、兩種方法分別運行10次來減少內存整理,cpu被其他應用占用等情況的干擾。

4)、參與測試的對象就是上面的相關代碼

5)、在多種Android軟硬件環境上進行測試