我們在學習JavaSE的時候?qū)W習過ObjectInputStream和ObjectOutputStream湿故,當時是覺得只要一個對象要寫入文件就必須要實現(xiàn)Serializable接口次哈。其實這樣理解完全沒有問題蹄衷。
一正歼、問題引入
Java中為什么要實現(xiàn)序列化接口呢?我們來看下圖:
Java程序中要往磁盤中寫入一個數(shù)據(jù)力穗,這個數(shù)據(jù)如果是一個普通字符串毅弧,那么沒有問題,所有機器都能正常識別字符串当窗,即使需要轉(zhuǎn)成對應(yīng)的字節(jié)够坐,計算機也知道怎么將字符串轉(zhuǎn)成對應(yīng)的字節(jié)(碼表),但是如果是一個Java對象那就麻煩了崖面,磁盤并不知道你傳遞的是一個Java對象元咙,換句話說,磁盤不知道按照什么格式把Java對象轉(zhuǎn)換成對應(yīng)的字節(jié)巫员。
我們知道Java對象本質(zhì)上是一個class字節(jié)碼庶香,磁盤并不知道怎么將這個字節(jié)碼寫入到磁盤中,按何種方式去寫简识,所以需要"標識"一下赶掖,告訴磁盤:“我是個Java對象,你要按這種方式寫入到磁盤中”七扰,只不過"按這種方式寫入到磁盤"奢赂。因此實現(xiàn)Serializable接口只是標識一下"我是個Java對象"
如果你懂了上述文字的理解,也就不難懂下述圖了:
二颈走、加深理解
Java 提供了一種對象序列化的機制呈驶。用一個字節(jié)序列可以表示一個對象,該字節(jié)序列包含該對象的數(shù)據(jù)疫鹊、對象的類型和對象中存儲的屬性等信息袖瞻。字節(jié)序列寫出到文件之后司致,相當于文件中持久保存了一個對象的信息。
反之聋迎,該字節(jié)序列還可以從文件中讀取回來脂矫,重構(gòu)對象,對它進行反序列化霉晕。對象的數(shù)據(jù)庭再、對象的類型和對象中存儲的數(shù)據(jù)信息,都可以用來在內(nèi)存中創(chuàng)建對象牺堰≈羟幔看圖理解序列化:
本篇文章來自PHP中文網(wǎng)的java學習教程欄目:https://www.php.cn/java/