序列化的兩種實現方式Serializable,Parcelable

概述

序列化就是把一個對象變成一個數據流,然後可以通過讀寫的方式那進行存儲、傳輸、恢復.在android重要有兩種方式來實現一個對象的可序列化:

方式一

通過實現Serializable接口類來實現可序列化,Serializable裏面沒有任何屬性和方法,只是一個標記接口,在進行序列化的時候,系統會判斷要序列化的這個類(A)是否實現了Serializable接口,如果實現了,這個類就可以進行序列化.

public static final long serialVersionUID = 59852348023l;

serialVersionUID 主要用來判斷這個類的結構是否發生了變化,如果相同就說明結構一樣可以進行反序列化,如果不同就代表類的結構發生了變化,這個時候的反序列化就只會根據實際情況恢復一些有的屬性了.

transient private boolean sex = true;

transient 時一個關鍵字,主要用於實現了Seriablizable接口的類的屬性前面,他的作用是指示這個屬性在序列化的時候可以忽略,比如說類A中有一個屬性sex,用戶不想保存起來,在前面添加transient,這個屬性就不會別序列化保存起來了,在恢復的時候,這個屬性就會用默認值代替.

寫一個實現了Serializble的類

package com.fht.ada.serializble;

import java.io.Serializable;

/**
 * 特點:代碼簡單,性能低,屬於Java 代碼簡單:用於存儲和網絡傳輸
 * 
 * @author Fht
 *
 */
public class User implements Serializable {
    public static final long serialVersionUID = 59852348023l;
    private String name = "fht";
    private int age = 26;
    transient private boolean sex = true;// 不會別序列化
}

序列化:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.o"));
oos.writeObject(new User());
oos.close();

反序列化:

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.o"));
Object o = ois.readObject();
if (o instanceof User) {
    User user = (User) o;
}
ois.close();

特點:
代碼簡單,性能低,屬於Java 用於存儲和網絡傳輸

方式二

通過實現Parcelable接口來實現,這種實現的方式稍微有一點複雜,但是他的性能比較高,因此廣泛的應用於android中進程間的通信

package com.fht.ada.parcelable;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * 特點:性能高,代碼複雜,屬於android 性能高:用於進程間通信
 * 
 * @author Fht
 *
 */
public class User implements Parcelable {
    private String name = "fht";
    private int age = 26;
    private boolean sex = true;

    public User(Parcel source) {
        this.name = source.readString();
        this.age = source.readInt();
        this.sex = source.readInt() == 1 ? true : false;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeInt(sex ? 1 : 0);
    }

    public static final Parcelable.Creator<User> creator = new Creator<User>() {

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

        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }
    };
}

特點:
性能高,代碼複雜,屬於android 用於進程間通信

源碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章