a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統 > Android > 正文

Android中的序列化淺析

2020-04-11 11:38:41
字體:
來源:轉載
供稿:網友

序列化原因

序列化的原因基本可以歸納為以下三種情況:

1.永久性保存對象,保存對象的字節序列到本地文件中;
2.對象在網絡中傳遞;
3.對象在IPC間傳遞。

序列化方法

在Android系統中關于序列化的方法一般有兩種,分別是實現Serializable接口和Parcelable接口,其中Serializable接口是來自Java中的序列化接口,而Parcelable是Android自帶的序列化接口。

上述的兩種序列化接口都有各自不同的優缺點,我們在實際使用時需根據不同情況而定。


1.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC,而相比之下Parcelable的性能更高(畢竟是Android自帶的),所以當在使用內存時(如:序列化對象在網絡中傳遞對象或序列化在進程間傳遞對象),更推薦使用Parcelable接口。

2.但Parcelable有個明顯的缺點:不能能使用在要將數據存儲在磁盤上的情況(如:永久性保存對象,保存對象的字節序列到本地文件中),因為Parcel本質上為了更好的實現對象在IPC間傳遞,并不是一個通用的序列化機制,當改變任何Parcel中數據的底層實現都可能導致之前的數據不可讀取,所以此時還是建議使用Serializable 。

代碼實現

Serializable接口的實現及使用

Serializable的接口實現很簡單,只需讓需要序列化的類繼承Serializable 即可,系統會自動將其序列化,具體代碼如下:

public class Book implements Serializable {  private static final long serialVersionUID = 21455356667888L;  private String mName;  private String mPrice;  public String getmName() {    return mName;  }  public void setmName(String mName) {    this.mName = mName;  }  public String getmPrice() {    return mPrice;  }  public void setmPrice(String mPrice) {    this.mPrice = mPrice;  }}

在Activity中使用方法:

// serializable對象傳遞方法public void setSerializableMethod() {  Book book = new Book();  book.setmName("王海康");  book.setmPrice("20$");  Intent intent = new Intent(this, BookTest.class);  Bundle bundle = new Bundle();  bundle.putSerializable(SER_KEY, book);  intent.putExtras(bundle);  startActivity(intent);}// serializable對象獲取方法public Book getSerializableMethod(){  Book mBook = (Book )getIntent().getSerializableExtra(SER_KEY);  return mBook;}

Parcelable接口的實現及使用

實現Parcelable接口主要可以分為一下幾步:
1)implements Parcelable。
2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從Parcel容器獲取數據。
3)重寫describeContents方法,內容接口描述,默認返回0即可。
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator 。
注意:若將Parcel看成是一個流,則先通過writeToParcel把對象寫到流里面,再通過createFromParcel從流里讀取對象,因此類實現的寫入順序和讀出順序必須一致。
具體實現代碼如下:

public class Person implements Parcelable {  private String mName;  private String mSex;  private int mAge;  public String getmName() {    return mName;  }  public void setmName(String mName) {    this.mName = mName;  }  public String getmSex() {    return mSex;  }  public void setmSex(String mSex) {    this.mSex = mSex;  }  public int getmAge() {    return mAge;  }  public void setmAge(int mAge) {    this.mAge = mAge;  }  @Override  public int describeContents() {    return 0;  }  @Override  public void writeToParcel(Parcel dest, int flags) {    dest.writeString(mName);    dest.writeString(mSex);    dest.writeInt(mAge);  }  public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {    @Override    public Person createFromParcel(Parcel source) {      Person person = new Person();      person.mName = source.readString();      person.mSex = source.readString();      person.mAge = source.readInt();      return person;    }    //供反序列化本類數組時調用的    @Override    public Person[] newArray(int size) {      return new Person[size];    }  };

在Activity中使用方法:

1)傳遞單一對象,具體代碼如下:

// parcelable對象傳遞方法public void setParcelableMethod() {  Person person = new Person();  person.setmName("王海康");  person.setmSex("男");  person.setmAge(45);  Intent intent = new Intent(this, PersonTest.class);  Bundle bundle = new Bundle();  bundle.putParcelable(PAR_KEY, person);  intent.putExtras(bundle);  startActivity(intent);}// parcelable對象獲取方法public Person getParcelableMethod(){  Person mPerson = (Person)getIntent().getParcelableExtra(PAR_KEY);  return mPerson;}

2)傳遞對象列表,具體代碼如下:
需要注意的是,若List personList = new ArrayList();則會報錯,因為下面調用的putParcelableArrayList()函數其中一個參數的類型為ArrayList。

// parcelable對象List傳遞方法public void setParcelableListMethod() {  ArrayList<Person> personList = new ArrayList<Person>();  Person person1 = new Person();  person1.setmName("王海康");  person1.setmSex("男");  person1.setmAge(45);  personList.add(person1);  Person person2 = new Person();  person2.setmName("薛岳");  person2.setmSex("男");  person2.setmAge(15);  personList.add(person2);  Intent intent = new Intent(this, PersonTest.class);  Bundle bundle = new Bundle();  bundle.putParcelableArrayList(PAR_LIST_KEY, personList);  intent.putExtras(bundle);  startActivity(intent);}// parcelable對象獲取方法public ArrayList<Person> getParcelableMethod(){  ArrayList<Person> mPersonList = getIntent().getParcelableExtra(PAR_LIST_KEY);return mPersonList;}

3)最后介紹一個投機取巧的方法:
不用繼承Parcelable或Serializable方法即可實現IPC中對象的傳遞。這種方法的實現原理不是很明白,只知道代碼中new ArrayList()返回的其實是一個EmptyArray.OBJECT數組,不過我感覺應該還是系統調用Serializable進行序列化的,如果各位讀者有好的想法,歡迎告知。
具體代碼如下:

//對象List傳遞public void setObjectMethod(){  ......(省略)  ArrayList list = new ArrayList();  //ObjectList為某一對象列表  list.add(ObjectList);  bundle.putParcelableArrayList(PAR_LIST_KEY, list);  intent.putExtras(bundle);  startActivity(intent);}//獲取對象ListArrayList list = bundle.getParcelableArrayList("list");//強轉成你自己定義的list,這樣ObjectList就是你傳過來的那個list了。ObjectList= (List<Object>) list.get(0);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本免费在线观看 | 在线观看成人精品 | 91tv亚洲精品香蕉国产一区 | 黄a一级| 欧美精品二区 | 成人精品国产免费网站 | 91中文视频| 国产一区二区精品久久 | 97综合| 欧美精品99 | 99视频网 | 国产精品ssss在线亚洲 | 日本免费一区二区三区 | 久久精品免费电影 | 国产精品成人在线观看 | 国产在线第一页 | 久久精品日韩 | 国产精品久久二区 | 午夜视频黄 | 国产无区一区二区三麻豆 | 亚洲香蕉精品 | 影音先锋 色先锋 | 成人在线三级 | 嫩草成人影院 | 91精品久久久久久久久中文字幕 | 狠狠综合久久av一区二区小说 | 久久久国产一区 | 国产精品视频一二 | 欧美日韩在线免费观看 | 欧美一区二区在线 | 可以免费观看的av | 国产97久久| 精品视频一区二区在线观看 | 综合二区 | 第一色视频 | 99精品欧美一区二区三区综合在线 | av在线免费观看一区二区 | 99爱免费观看 | 亚洲视频在线观看 | 日本中文字幕在线看 | 免费成人在线网站 |