Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android進程通信之兩種序列化方式分析

Android進程通信之兩種序列化方式分析

編輯:關於Android編程

2月下旬辭職了,去海南度假到現在,領略了一把三亞風情也算任性和這裡寫圖片描述

然而這樣任性帶來的後果就是。。不行了我必須吐槽一句。。

沒畢業的找工作就這麼難嘛!投了57家一家面試機會都沒有,好歹給個面試機會啊!!本寶寶不開心!!

不知道其他沒有畢業的童鞋是不是也是這種遭遇呢,難道真的是寒冬。。 其實還是自己能力不夠。。不過別灰心,只要自己足夠努力,遲早會有工作的(標標居然建議我先去端盤子????媽蛋)。

牢騷完畢,為了更好地提升自己,趕緊翻開了主席的《開發藝術探索》,開始學習今天的內容。在說Messanger之前呢,先有必要說說Android中的序列化。

序列化的兩種方式

在Android中有兩種序列化方式,Serializable(原諒我到現在都不會拼寫。。)和Parcelable。其中Serializable是java提供的,而Parcelable是Android獨有的。

兩種序列化的不同:
Parcelable的效率高,但是使用麻煩,主要用於內存序列化。
Serializable使用簡單,但是需要做大量的I/O操作,開銷很大,適用於儲存設備,或者網絡傳輸。

Serializable的使用

Serializable的使用及其簡單,只要實現Serializable接口即可。
在用ObjectOutputStream和ObjectInputStream即可進行序列化操作,舉個栗子:

public class Goods implements Serializable{
    private int mId;

    public Goods(int id){
        mId = id;
    }

    public int getmId() {
        return mId;
    }
}
 Goods goods = new Goods(3);

        //序列化
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/sdcard/test.txt"));
            oos.writeObject(goods);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //反序列化
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("/sdcard/test.txt"));
            Goods goodsIn = (Goods)ois.readObject();
            ois.close();
            Log.e("wing",goodsIn.getmId()+"");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

這時,可以看到控制台輸出了id 為3。

需要指出的一點是,為了保證序列化的正確性,應該給Goods類添加一個序列化UID。即serialVersionUID。這裡用戶可以自定義,主要是類的版本檢驗,在反序列化過程中,如果這個id值不一致,則反序列化失敗。

private static final long serialVersionUID = 615555755L

Parcelable的使用

parcelable的使用稍微復雜。但是有強大的as其實也很簡單。再以Goods為例,多增加一個name屬性。
先實現Parcelable接口,按照提示生成如下代碼:

public class Goods implements Parcelable{
    private int mId;
    private String mName;

    public Goods(int id,String name){
        mId = id;
        mName = name;
    }

    protected Goods(Parcel in) {
        mId = in.readInt();
        mName = in.readString();
    }
    //自動生成的代碼
    public static final Creator CREATOR = new Creator() {
        @Override
        public Goods createFromParcel(Parcel in) {
            return new Goods(in);
        }

        @Override
        public Goods[] newArray(int size) {
            return new Goods[size];
        }
    };

    public int getmId() {
        return mId;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mId);
        dest.writeString(mName);
    }
}

這樣便實現了一個Parcel的序列化。當然這都是AS給你生成好的,我們來分析下裡面的方法。
看多增加的一個構造器,參數為parcel,他給屬性是通過Parcel.read()進行的,比如你的id為int類型,那麼就為id = in.readInt(); 這部分應該很好理解。
再來看與之對應的wirteToParcel接口,就是把這些屬性write出去。

在用intent傳遞數據的時候,可以傳遞實現序列化的類,當然list和map也可以,要求內部元素也是可序列化的。值得注意的是intent傳遞有個致命的缺陷,就是大小限制。 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved