Android Parcelable序列化和反序列化(對象的讀寫方案)
背景:
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






