我們?cè)趯W(xué)習(xí)JavaSE的時(shí)候?qū)W習(xí)過(guò)ObjectInputStream
和ObjectOutputStream
,當(dāng)時(shí)是覺(jué)得只要一個(gè)對(duì)象要寫(xiě)入文件就必須要實(shí)現(xiàn)Serializable接口。其實(shí)這樣理解完全沒(méi)有問(wèn)題。
一、問(wèn)題引入
Java中為什么要實(shí)現(xiàn)序列化接口呢?我們來(lái)看下圖:
Java程序中要往磁盤(pán)中寫(xiě)入一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)如果是一個(gè)普通字符串,那么沒(méi)有問(wèn)題,所有機(jī)器都能正常識(shí)別字符串,即使需要轉(zhuǎn)成對(duì)應(yīng)的字節(jié),計(jì)算機(jī)也知道怎么將字符串轉(zhuǎn)成對(duì)應(yīng)的字節(jié)(碼表),但是如果是一個(gè)Java對(duì)象那就麻煩了,磁盤(pán)并不知道你傳遞的是一個(gè)Java對(duì)象,換句話說(shuō),磁盤(pán)不知道按照什么格式把Java對(duì)象轉(zhuǎn)換成對(duì)應(yīng)的字節(jié)。
相關(guān)視頻教程分享:java學(xué)習(xí)
我們知道Java對(duì)象本質(zhì)上是一個(gè)class字節(jié)碼,磁盤(pán)并不知道怎么將這個(gè)字節(jié)碼寫(xiě)入到磁盤(pán)中,按何種方式去寫(xiě),所以需要"標(biāo)識(shí)"一下,告訴磁盤(pán):“我是個(gè)Java對(duì)象,你要按這種方式寫(xiě)入到磁盤(pán)中”,只不過(guò)"按這種方式寫(xiě)入到磁盤(pán)"。因此實(shí)現(xiàn)Serializable接口只是標(biāo)識(shí)一下"我是個(gè)Java對(duì)象"
如果你懂了上述文字的理解,也就不難懂下述圖了:
二、加深理解
Java 提供了一種對(duì)象序列化的機(jī)制。用一個(gè)字節(jié)序列可以表示一個(gè)對(duì)象,該字節(jié)序列包含該對(duì)象的數(shù)據(jù)、對(duì)象的類(lèi)型和對(duì)象中存儲(chǔ)的屬性等信息。字節(jié)序列寫(xiě)出到文件之后,相當(dāng)于文件中持久保存了一個(gè)對(duì)象的信息。
反之,該字節(jié)序列還可以從文件中讀取回來(lái),重構(gòu)對(duì)象,對(duì)它進(jìn)行反序列化。對(duì)象的數(shù)據(jù)、對(duì)象的類(lèi)型和對(duì)象中存儲(chǔ)的數(shù)據(jù)信息,都可以用來(lái)在內(nèi)存中創(chuàng)建對(duì)象。看圖理解序列化:
相關(guān)文章教程推薦:java入門(mén)程序