亚洲欧美日韩熟女|做爱高潮视频网址|国产一区二区三级片|国产Av中文字幕www.性色av|亚洲婷婷永久免费|国产高清中文字幕|欧美变态网站久re视频精品|人妻AV鲁丝第一页|天堂AV一区二区在线观看|综合 91在线精品

Android Parcelable序列化和反序列化(對象的讀寫方案)

2023-04-12


背景:


Android在序列化中,官方給出了Parcelable的方案,關(guān)于Parcelable的使用,可以參考Parcelable序列化教程

有了序列化的詳細(xì)使用,我們肯定想知道如何把Parcelable序列化保存起來呢?常見的保存就是網(wǎng)絡(luò)存儲或者本地存儲。

知道了本地存儲,網(wǎng)絡(luò)就是將byte字節(jié)傳給服務(wù)器。接下來我們將會介紹設(shè)備本機(jī)上的序列化和反序列化

1.序列化



public static void save(Context context, Parcelable parcelable, String fileName) {


    File file = new File(context.getExternalCacheDir().getAbsolutePath() + File.separator + fileName);

    try {
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream out = (new FileOutputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(out);
        Parcel parcel = Parcel.obtain();
        parcel.writeParcelable(parcelable, 0);
        bos.write(parcel.marshall());
        bos.flush();
        bos.close();
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();

    }


}



在序列化過程中,保存的位置和文件的讀寫。如果是安全比較高的,建議保存在cache文件夾下,這樣避免被清除了。文件名最好用英文,上面的方法就是采用cache文件夾。


文件的讀寫不在過多介紹


如何將Parcelable的對象變成二進(jìn)制?離不開我們的老朋友Parcel,Parcel在Parcelable的序列化中也出現(xiàn)了,讀寫變量。


這里面同樣,通過 Parcel parcel = Parcel.obtain();創(chuàng)建一個臨時對象,




/**
 * Retrieve a new Parcel object from the pool.
 */
public static Parcel obtain() {
    final Parcel[] pool = sOwnedPool;
    synchronized (pool) {
        Parcel p;
        for (int i=0; i



接下來我們將Parcelable的對象保存到parcel中


parcel.writeParcelable(parcelable, 0);


通過parcel.marshall()將對象變成byte字節(jié)。




public final byte[] marshall() { return nativeMarshall(mNativePtr); }




這樣我們將byte[]寫到我們創(chuàng)建的文件中,至此,序列化已保存到我們的本地設(shè)備中


2.反序列化


了解了序列化過程,反序列化也是這些東西參與進(jìn)來。



public static Parcelable getBeanByFileName(Context context, String fileName) {
    File file = new File(context.getExternalCacheDir().getAbsolutePath() + File.separator + fileName);
    People person=null;
    try {
        FileInputStream in = new FileInputStream(file);
        byte[] bytes = new byte[in.available()];
        in.read(bytes);
        Parcel parcel = Parcel.obtain();
        parcel.unmarshall(bytes, 0, bytes.length);
        parcel.setDataPosition(0);
         person = parcel.readParcelable(Thread.currentThread().getContextClassLoader());


    } catch (Exception e) {
        e.printStackTrace();
    }
    return person;

}


2.1找到序列化的文件位置

2.2把文件的中信息讀取存入字節(jié)數(shù)組。

2.3 創(chuàng)建一個臨時的 Parcel parcel = Parcel.obtain();對象

2.4 通過parcel進(jìn)行反序列化 parcel.unmarshall(bytes, 0, bytes.length);

2.5 將parcel反序列化對象讀取出來

person = parcel.readParcelable(Thread.currentThread().getContextClassLoader());

這樣反序列化結(jié)束。


關(guān)于parcelunmarshall和marshall,感興趣的可以自行查看源碼。


文件名:一定要組織好,否則存在失敗問題。上述方法已測試,可以執(zhí)行


本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請在文中注明來源及作者名字。

免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請及時與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com