亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Serializable的簡單認識

Serializable的簡單認識 時間:2018-09-27      來源:未知

Serializable的簡單認識

一、Serializable簡介

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

public interface Serializable {

/* empty */

}

二、Serializable的簡單應用

1、對象的存儲

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

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

自定義一個Books類:

public class Books implements Serializable {

private static final long serialVersionUID = 12345678L;

public String name = "紅樓";

public Books(String name) {

super();

this.name = name;

}

}

布局文件就不做介紹,上面就放置兩個按鈕,一個實現(xiàn)序列化,一個實現(xiàn)反序列化。對應的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();

}

});

}

/**

* 實現(xiàn)序列化存儲

*/

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();

}

}

/**

* 反序列化從存儲設備讀取對象

*/

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();

}

}

}

上面程序運行,點擊序列化按鈕。

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

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

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

在序列化時會將serialVersionUID值也寫入序列化的文件中,當我們把類的結構改變后,當前類中的serialVersionUID會重新生成,這就導致文件中serialVersionUID和目前的serialVersionUID不一致,就如上面輸出信息提示所示,這將會導致反序列化失敗。

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

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;

}

}

/**

* 反序列化從存儲設備讀取對象

*/

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();

}

}

然后重新編譯運行直接反序列化:

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

2、對象的傳遞

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

putExtra(String name, Serializable value)

如下所示:

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

Intent intent = new Intent();

intent.putExtra("data", books);

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

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

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

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

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 国产日韩中文字幕 | 国产一级毛片一区二区三区 | 日本的黄色片 | 久久99精品麻豆国产 | 天天干成人网 | 欧美videos极品 | 日本道精品一区二区三区 | 97碰在线视频| 国产欧美一区二区精品仙草咪 | www日本高清 | 蜜桃臀久久伊人福利 | 日韩在线看片 | 99久久精品免费看国产四区 | 亚洲成a人片在线观看精品 亚洲成a人片在线观看中文 | 日韩精品高清自在线 | 亚洲欧洲日本在线 | 人人人人草 | 91精品国产91热久久久久福利 | 亚洲成a人片在线v观看 | 黄色片一区| 久久精品视频观看 | 日本三级香港三级网站 | 欧美成人免费看片一区 | 国产一级三级三级在线视 | 久久精品女人毛片国产 | 国产一区二区视频在线观看 | 99精品高清不卡在线观看 | 免费观看在线视频 | 免费视频h| 欧美日韩一区二区在线视频播放 | 99久久精品国产国产毛片 | 久碰人澡人澡人澡人澡91 | 九九全国免费视频 | 国产亚洲精品第一综合linode | 久久亚洲精品中文字幕二区 | 欧美日韩一区二区三区视频在线观看 | 日本久久高清视频 | 高清不卡一区二区 | 欧美黑人xxxx猛牲大交 | 99久热只有精品视频免费看 | 欧美videos黑人巨大 |