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