序列化接口:Serializable 、Parcelable

1、Serializablejava

    1.    序列化類Userandroid

public class User implements Serializable{
    
    private static final long serialVersionUID = 212321837362716712L;
    public int userId;
    public String userName;
    public boolean isMale;
    
    /**
     * Ignore getter and setter 
     */
     .....
}

    2.    序列化過程數組

    User user = new User(0,"jake",true);
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
    out.writeObject(user);
    out.close();

    3.    反序列化過程ide

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
    User newUser = (User)in.readObject();
    in.close();


    由上述代碼能夠看到,this

    一、序列化就是將可序列化類寫入到cache.txt文件;線程

    二、反序列化過程當中從該文件讀取數據並實例化新的對象
code

    三、不指定serialVersionUID也能夠序列化,可是序列化過程會將該標識寫入,反序列化時用於校驗對象


注:靜態成員變量屬於類不屬於對象,不會參與序列化過程;內存

        用transient關鍵字標記的成員變量不參與序列化過程。
資源


2、Parcelable

    1.    序列化,反序列化 示例類 User.java

package com.android.shieh.processtest.modle;

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

/**
 * Created by Shieh on 2015/11/26.
 */
/**
 * 內存序列化用Parcelable
 * */
public class User implements Parcelable{

    public int userId;
    public String userName;
    public boolean isMale;

    public Book book;

    public User(int userId, String userName, boolean isMale){
        this.userId = userId;
        this.userName = userName;
        this.isMale = isMale;
    }

    /**
     * 返回當前對象內容描述
     * 幾乎在全部狀況下都返回 0
     * 僅噹噹前對象中存在文件描述符時返回 1
     * */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 將當前對象寫入序列化結構,flags能夠爲0或1
     * 1:標識當前對象須要做爲返回值返回,不能當即釋放資源
     * 0:一般都爲0
     * */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(userId);
        dest.writeString(userName);
        dest.writeInt(isMale ? 1 : 0);
        dest.writeParcelable(book, 0);
    }

    /**
     * 反序列化過程
     * */
    public static final Parcelable.Creator<User> CREATOR
            = new Parcelable.Creator<User>(){

        /**
         * 從序列化後的對象中建立原始對象
         * */
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        /**
         * 建立指定長度的原始對象數組
         * */
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    private User(Parcel in){
        userId = in.readInt();
        userName = in.readString();
        isMale = in.readInt() == 1;
        /**
         * book 是另外一個可序列化對象,因此它的反序列化須要傳遞當前線程的上下文類加載器
         */
        book = in.readParcelable(Thread.currentThread()
                .getContextClassLoader());
    }
}

    

2. 另外一個可序列化類 Book.java,未實現裏面的方法,初創類就是以下的結構

package com.android.shieh.processtest.modle;

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

/**
 * Created by Shieh on 2015/11/27.
 */
public class Book implements Parcelable {
    protected Book(Parcel in) {
    }

    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
    }
}
相關文章
相關標籤/搜索