色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Serializable的簡單認(rèn)識(shí)

Serializable的簡單認(rèn)識(shí) 時(shí)間:2018-09-27      來源:未知

Serializable的簡單認(rèn)識(shí)

一、Serializable簡介

Serializable是Java中的一個(gè)提供序列化的接口,可以為對(duì)象提供序列化和反序列化。Serializable接口是一個(gè)空接口,使用起來非常方便,只需要將準(zhǔn)備序列化的類實(shí)現(xiàn)該接口即可。

public interface Serializable {

/* empty */

}

二、Serializable的簡單應(yīng)用

1、對(duì)象的存儲(chǔ)

一般情況下我們見得比較多的是將一些具體的數(shù)據(jù),如數(shù)字、文字、視頻、音頻等會(huì)保存到存儲(chǔ)設(shè)備上,但有的時(shí)候也需要將對(duì)象持久化到存儲(chǔ)設(shè)備上,這個(gè)時(shí)候就需要使用Serializable將對(duì)象持久化的操作,即將對(duì)象保存到存儲(chǔ)設(shè)備上。

通過Serializable的方式非常簡單,因?yàn)榇蠖鄶?shù)工作都由系統(tǒng)完成,我們只需讓對(duì)象的類實(shí)現(xiàn)Serializable接口,并且使用ObjectInputStream和ObjectOutputStream即可完成,來看下面的的列子。

自定義一個(gè)Books類:

public class Books implements Serializable {

private static final long serialVersionUID = 12345678L;

public String name = "紅樓";

public Books(String name) {

super();

this.name = name;

}

}

布局文件就不做介紹,上面就放置兩個(gè)按鈕,一個(gè)實(shí)現(xiàn)序列化,一個(gè)實(shí)現(xiàn)反序列化。對(duì)應(yīng)的MainActivity代碼如下:

public class MainActivity extends Activity {

File file = new File(Environment.getExternalStorageDirectory(),

"serializable.txt");

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.bt1).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

write();

}

});

findViewById(R.id.bt2).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

read();

}

});

}

/**

* 實(shí)現(xiàn)序列化存儲(chǔ)

*/

private void write() {

try {

Books books = new Books("三國");

FileOutputStream fout = new FileOutputStream(file);

ObjectOutputStream out = new ObjectOutputStream(fout);

out.writeObject(books);

System.out.println("books = " + books);

out.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 反序列化從存儲(chǔ)設(shè)備讀取對(duì)象

*/

private void read() {

try {

FileInputStream fin = new FileInputStream(file);

ObjectInputStream in = new ObjectInputStream(fin);

Books books = (Books) in.readObject();

System.out.println("books = " + books);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

上面程序運(yùn)行,點(diǎn)擊序列化按鈕。

在sd卡目錄下找到我們保存的文件,打開。

可以看到我們已經(jīng)將程序中創(chuàng)建的Books對(duì)象book存儲(chǔ)到的sd卡上。點(diǎn)擊反序列化按鈕即可將對(duì)象的數(shù)據(jù)從sd卡反序列化,從新生成一個(gè)Books對(duì)象,如下打印信息所示,可以看到數(shù)據(jù)是一樣的,但是這兩個(gè)對(duì)象并不是同一個(gè)了。

大家會(huì)發(fā)現(xiàn)在Books類中聲明了一個(gè)serialVersionUID,這個(gè)常量并不是必須的,不聲明也可實(shí)現(xiàn)對(duì)象的序列化,但是在一些情況下會(huì)對(duì)反序列化產(chǎn)生影響。如果我們不去自己指定一個(gè)serialVersionUID,在序列化時(shí)會(huì)按照類的結(jié)構(gòu)自動(dòng)生成一個(gè)serialVersionUID值,但是在序列化存儲(chǔ)后改變了類的結(jié)構(gòu),如增加和刪除成員變量,重新編譯運(yùn)行后直接進(jìn)行反序列化的話,這個(gè)時(shí)候會(huì)出現(xiàn)反序列化失敗。

在序列化時(shí)會(huì)將serialVersionUID值也寫入序列化的文件中,當(dāng)我們把類的結(jié)構(gòu)改變后,當(dāng)前類中的serialVersionUID會(huì)重新生成,這就導(dǎo)致文件中serialVersionUID和目前的serialVersionUID不一致,就如上面輸出信息提示所示,這將會(huì)導(dǎo)致反序列化失敗。

但是當(dāng)手動(dòng)指定serialVersionUID后,如果將類的結(jié)構(gòu)改變之后,反序列化依舊會(huì)成功,并且將大程度的恢復(fù)數(shù)據(jù)。還是上面那個(gè)例子,先進(jìn)行序列化,然后在Books類中增加一個(gè)成員變量:

public class Books implements Serializable {

private static final long serialVersionUID = 12345678L;

public String name = "紅樓";

public int price = 100;

public Books(String name) {

super();

this.name = name;

}

}

/**

* 反序列化從存儲(chǔ)設(shè)備讀取對(duì)象

*/

private void read() {

try {

FileInputStream fin = new FileInputStream(file);

ObjectInputStream in = new ObjectInputStream(fin);

Books books = (Books) in.readObject();

// 打印輸出類中的成員變量

System.out.println("books = " + books+" "+books.name+" "+books.price);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

然后重新編譯運(yùn)行直接反序列化:

可以看到這次反序列化成功,并且原本序列化文件中并沒有“price”的數(shù)據(jù),通過自己指定serialVersionUID后能避免類似的情況,這里就給該屬性附了一個(gè)默認(rèn)值0。

2、對(duì)象的傳遞

這里只是介紹利用Intent傳遞對(duì)象,Intent默認(rèn)沒有提供一個(gè)方法直接去傳遞一個(gè)對(duì)象,但是可以將對(duì)象序列化后便可。Intent中的putExtra方法就可以傳遞一個(gè)Serializable 類型的數(shù)據(jù),所以只需要這個(gè)類實(shí)現(xiàn)Serializable 接口即可。

putExtra(String name, Serializable value)

如下所示:

Books books = new Books("三國");

Intent intent = new Intent();

intent.putExtra("data", books);

在接收數(shù)據(jù)時(shí)利用intent中對(duì)應(yīng)的Serializable getSerializableExtra(String name)方法即可。

Books newbook = (Books) intent.getSerializableExtra("data");

上一篇:UI到底是怎么接受事件的事件

下一篇:Android中Intent對(duì)象與Intent Filter過濾匹配過程詳解

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 美国少妇性xxxx另类 | 日本无码全黄二区三区大片免费看 | 最好看的2018中文在线观看 | 久久手机看片 | 中文字幕二十三页2 | 少妇人妻偷人精品视频 | 免费涩涩| 噼里啪啦国语在线播放中文版 | 麻豆免费观看 | 国产精品高潮呻吟av | 99精品久久99久久久久胖女人 | 天天看高清特色大片 | 蜜桃AV少妇久久久久久高潮不断 | 正在播放 露脸 一区 | 免费无套内谢少妇毛片A片软 | 亚洲AV色噜噜男人的天堂 | aⅴ中文字幕不卡在线无码 男人深夜影院 | 欧美精产国品一二三产品区别在哪 | 无码人妻一区二区三区免费视频 | 91看黄色片 | 人妻丰满熟妇av无码区 | 免费观看又色又爽又黄的校园 | 国产偷ⅴ国产偷v精品 | 天天做天天爱夜夜爽毛片L 无码AV在线一本无码 | 午夜精品久久久久9999 | 国产成人综合日韩精品无码不卡 | 中文字幕奶水喷出在线观看 | 小蜜被两老头吸奶头在线观看 | 桃乃木香奈视频在线播放 | 少妇又爽又刺激视频 | 欧美性1生交XXXXX无码 | 亚洲AV成人无码一区无广告 | 一区二区欧美在线 | 巨熟乳波霸若妻在线播放 | 暖暖视频免费高清日本 | 成人亚洲欧美丁香在线观看 | 国精品无码一区二区三区在线蜜臀 | 亚洲国产日韩在线人成蜜芽 | 亚洲精品乱码日本按摩久久久久 | 欧美日韩一区精品视频一区二区 | 亚欧成A人无码精品VA片 |