本文將講解Android中數據傳輸中需要了解的數據序列化方面的知識,我們知道Android開發過程中不同Activity之間傳輸數據可以通過Intent對象的put**方法傳遞,對于java的八大基本數據類型(char int float double long short boolean byte)傳遞是沒有問題的,但是如果傳遞比較復雜的對象類型(比如對象,比如集合等),那么就可能存在問題,而這時候也就引入了數據序列化的概念。
這里我們先看一下呢序列化在百科上的定義
序列化 (Serialization)將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。 簡單來說就是我們的數據在傳輸的時候需要將信息轉化為可以傳輸的數據,然后在傳輸的目標方能夠反序列化將數據還原回來,這里的將對象狀態信息轉換為可傳輸數據的過程就是序列化,將可傳輸的數據逆還原為對象的過程就是反序列化。
知道前面的序列化定義,內存對象什么需要實現序列化呢?
永久性保存對象,保存對象的字節序列到本地文件。
通過序列化對象在網絡中傳遞對象。
通過序列化對象在進程間傳遞對象。
實現序列化的兩種方式:
那么我們如何實現序列化的操作呢?在Android開發中我們實現序列化有兩種方式:
實現Serializable接口
實現parcelable接口
都知道在Android studio中序列化有兩種方式:serializable與parcelable。那么這兩種實現序列化的方式有什么區別呢?下面是這兩種實現序列化方式的區別:
Serializeble是java的序列化方式,Parcelable是Android特有的序列化方式;
在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable。
最后還有一點就是Serializeble序列化的方式比較簡單,直接集成一個接口就好了,而parcelable方式比較復雜,不僅需要集成Parcelable接口還需要重寫里面的方法。
對象實現序列化的實例:
通過實現Serializable接口實現序列化:
上面介紹了那么多概念上的知識,下面我們就具體看一下如何通過這兩種方式實現序列化,我們首先看一下如何通過實現Serializable接口實現序列化,通過實現Serializable接口實現序列化,只需要簡單的實現Serialiizable接口即可。通過實現Serializable接口就相當于標記類型為序列化了,不需要做其他的操作了。
/** * Created by aaron on 16/6/29. */public class Person implements Serializable{ public static final long serialVersionUID = 1; PRivate int age; private String name; private String address; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }}可以發現我們定義了一個普通的實體Person類,并設置了三個成員屬性以及各自的set,get方法,然后我們就只是簡單的實現了Serializable接口就相當于將該類序列化了,當我們在程序中傳輸該類型的對象的時候就沒有問題了。
并且我們在Person類中定義了一個屬性為serialVersionUID的成員變量,這個成員變量是做什么的呢? 在Java中,軟件的兼容性是一個大問題,尤其在使用到對象串行性的時候,那么在某一個對象已經被串行化了,可是這個對象又被修改后重新部署了,那么在這種情況下, 用老軟件來讀取新文件格式雖然不是什么難事,但是有可能丟失一些信息。 serialVersionUID來解決這些問題,新增的serialVersionUID必須定義成下面這種形式:
public static final long serialVersionUID=1;其中數字后面加上的L表示這是一個long值。 通過這種方式來解決不同的版本之間的串行化的問題。
簡單來說就是用serialVersionUID標識class類的版本,當序列化的class源文件發生變化時,反序列化的一端由于該標識不一致會反序列化失敗,進而保證了兩端源文件的一致性。
通過實現Parcelable接口實現序列化:
然后我們在看一下通過實現Parcelable接口來實現序列化的方式,通過實現Parcelable接口實現序列化相當于實現Serialiable接口稍微復雜一些,因為其需要實現一些特定的方法,下面我們還是以我們定義的Person類為例子,看一下如果是實現Parcelable接口具體是如何實現的:
** * Created by aaron on 16/6/29. */public class Person implements Parcelable{ private int age; private String name; private String address; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.age); dest.writeString(this.name); dest.writeString(this.address); } public Person() { } protected Person(Parcel in) { this.age = in.readInt(); this.name = in.readString(); this.address = in.readString(); } public static final Creator<Person> CREATOR = new Creator<Person>() { @Override public Person createFromParcel(Parcel source) { return new Person(source); } @Override public Person[] newArray(int size) { return new Person[size]; } };}可以發現當我們通過實現Parcelable接口實現序列化還需要重寫里面的成員方法,并且這些成員方法的寫法都比較固定。
實現Parcelable序列化的Android studio插件:
順便說一下最近發現一個比較不錯的Parcelable序列化插件。下面就來看一下如何安裝使用該插件。
打開Android studio –> settings –> Plugins –> 搜索Parcelable –> Install –> Restart,這樣安裝好了Parcelable插件; 然后在源文件中右鍵 –> Generate… –> Parcelable 點擊Parcelable之后可以看到,源文件中已經實現了Parcelable接口,并重寫了相應的方法: 這樣我們就安裝好Parcelable插件了,然后當我們執行Parcelable操作的時候就重寫了Parcelable接口的相應序列化方法了。
可以通過實現Serializable和Parcelable接口的方式實現序列化
實現Serializable接口是java中實現序列化的方式,而實現Parcelable是Android中特有的實現序列化的方式,更適合Android環境
實現Serializable接口只需要實現該接口即可無需其他操作,而實現Parcelable接口需要重寫相應的方法
Android studio中有實現Parcelable接口的相應插件,可安裝該插件很方便的實現Parcelable接口,實現序列化
新聞熱點
疑難解答