Android中數據序列化之Serializable與Parcelable

fdsfsdjf3 7年前發布 | 6K 次閱讀 Java 安卓開發 Android開發 移動開發

  • Serializable

序列化Serializable是Java語言的特性之一,是將java對象轉換成字節序列的過程,與之對應的是反序列化。反序列化是將字節序列轉化為java對象的過程。
Serializable通過實現接口進行標志,只要定義的Java對象實現了Serializable接口,不有實現任何方法,java就會對該對象 諸如對如下類進行序列化及反序列化操作

public class SerDemo implements Serializable { //開發工具提示生成的serialVersionUID private static final long serialVersionUID = 4046555564483893134L; private int age; //ArrayList已經實現了序列化接口 private ArrayList<BannerImg> bannerImgs;

public class BannerImg implements Serializable {
    private static final long serialVersionUID = -344227642091683711L;
    public String mIconUrl;
    public String mValue;

    public BannerImg(String mIconUrl, String mValue) {
        this.mIconUrl = mIconUrl;
        this.mValue = mValue;
    }
}

public SerDemo() {
    this.age = 0;
    this.bannerImgs = new ArrayList<>();
}

}</code></pre>

對SerDemo進行序列化及反序列化操作示例:

//序列化需要把對象轉換成諸如FileOutputSream等輸出流,再轉成ObjectOutputSteam,然后調用相應方法序列化保存到文件。
    private void writeToCache(SerDemo banner) {
        FileOutputStream fos = null;
        ObjectOutput objectOutput = null;
        //判斷sd卡是否存在
        if (Environment.getExternalStorageState()
                .equals(android.os.Environment.MEDIA_MOUNTED)) {
            //將指定WenkuBanner對象序列化到SD卡中
            try {
                //文件路徑最好是靈活配置
                File file = new File(Environment.getExternalStorageDirectory() + "/ldm");
                fos = new FileOutputStream(file);
                objectOutput = new ObjectOutputStream(fos);
                if (objectOutput != null) {
                    objectOutput.writeObject(banner);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != fos) {
                        fos.close();
                    }
                    if (null != objectOutput) {
                        objectOutput.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            //提示SD卡不存在
        }
    }

//模擬把一個Java對象反序列化
//反序列化需要把文件數據轉換成諸如FileInputSream等輸入流,再轉成ObjectInputSteam,然后調用相應方法轉成對象。
private SerDemo readFromCache() {
    File file = null;
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    SerDemo banner = null;
    if (Environment.getExternalStorageState()
            .equals(android.os.Environment.MEDIA_MOUNTED)) {
        //將指定WenkuBanner對象序列化到SD卡中
        try {
            //文件路徑最好是靈活配置
            file = new File(Environment.getExternalStorageDirectory() + "/ldm");
            //這里還要判斷文件是否存在
            fis = new FileInputStream(file);
            ois = new ObjectInputStream(fis);
            if (null != ois) {
                //獲取到WenkuBanner對象
                banner = (SerDemo) ois.readObject();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fis) {
                    fis.close();
                }
                if (null != ois) {
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } else {
        //提示SD卡不存在
    }
    return banner;
}</code></pre> 

  • Parcelable

    Parcelable是AndroidSDK提供的一種基于內存讀寫的高速序列化操作。在Android跨進程數據通訊中 數據對象一般要求實現Parcelable接口,實現Parcelable指定的方法。

    比如對下面類通過Parcelable進行序列化及反序列化

public class ParcelDemo implements Parcelable {
    private String name;
    private int age;
    private String subjcet;

public ParcelDemo() {
}

//從Parcel中獲取變量的內容
protected ParcelDemo(Parcel in) {
    this.name = in.readString();
    this.age = in.readInt();
    this.subjcet = in.readString();
}

public static final Creator<ParcelDemo> CREATOR = new Creator<ParcelDemo>() {
    //反序列化方法,將writeToParcel方法寫入的Parcel反序列成ParcelDemo
    @Override
    public ParcelDemo createFromParcel(Parcel in) {
        return new ParcelDemo(in);
    }

    //這個方法是提供給其它類反序列化該類的數組時調用
    @Override
    public ParcelDemo[] newArray(int size) {
        return new ParcelDemo[size];
    }
};

//接口內容描述 ,通常返回0即可
@Override
public int describeContents() {
    return 0;
}

//實現序列化操作的方法,將類數據寫到Parcel窗口中
@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(name);
    parcel.writeInt(age);
    parcel.writeString(subjcet);
}

}

開發工具實現Parcelable只會提示你要實現的方法,如果在AndroidStuiod中安裝了Parcelable Code Generator插件, 就會在提示生成方法時自動添加對應代碼,非常方便。</code></pre>

 

來自:http://www.androidchina.net/6560.html

 

 本文由用戶 fdsfsdjf3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!