面試題:如何實現(xiàn)Java的序列化?
答案:序列化一個對象還是比較簡單的,只要讓它實現(xiàn)serializable接口就行了。但是,當余元引入序列化概念之后,它的很多標準類庫的類,包括primitive的wrapper類、所有的容器類,以及別的很多類,都會相應的發(fā)生改變,甚至連class對象都會被序列化。
要想序列化對象,必須先創(chuàng)建一個outputstream,然后把它嵌進objectoutputstream。這時就能用writeobject()方法把對象寫入outputstream,。讀的時候需要把inputstream嵌到objectinputstream中,然后在調用readobject()方法。不過這樣讀出來的只是一個object的reference,因此,在用之前,還得線下傳。對象序列化不僅能保存對象的副本,而且還會跟著對象中reference把它所引用的對象也保存起來,然后再繼續(xù)跟蹤那些對象的reference,以此類推。這種情形常被稱為“單個對象所連接的‘對象網(wǎng)’”。這個機制所涵蓋的范圍不僅包括對象的成員數(shù)據(jù),而且還包含數(shù)組里面的reference。如果要自己實現(xiàn)對象序列化,那么編寫跟蹤這些鏈接的程序將會是一件非常痛苦的任務。但是,Java的對象序列化就能準確無誤地做到這一點,毫無疑問,它的遍歷算法是做過優(yōu)化的。
知識拓展:Java的“對象序列化”能將一個是想了serializable接口的對象轉換成一組byte,這樣日后要用這個對象的時候,就能把這些byte數(shù)據(jù)恢復出來,并據(jù)此重新構建那個對象。這一點甚至在擴網(wǎng)絡的環(huán)境下也是如此,這就意味著序列化機制能自動補償操作系統(tǒng)方面的差異。也就是說,可以在Windows創(chuàng)建一個對象,序列化之后,在他通過網(wǎng)絡傳到Unix上,然后在哪里進行重建。不用擔心在不同的平臺上數(shù)據(jù)是怎樣表示的,以及byte順序怎樣,或者別的什么細節(jié)。
對象序列化能實現(xiàn)“輕量級的persistence”。所謂的persistence,是指對象的生命周期不是由程序是否運行決定的,在程序的兩次調用之間對象仍然還活著。通過“將做過序列化處理的對象寫入磁盤,等到程序再次運行的時候再把它讀出來”,可以達到persistence的效果。之所以說“輕量級”,是以內不能用想“persistent”這樣的關鍵詞來直接定義一個對象,然后讓系統(tǒng)去處理所有的細節(jié)。相反,必須明確的進行序列化和解序列化。
之所以要在語言里加入對象序列化,是因為要用它來實現(xiàn)兩個重要的功能。Java的遠程方法調用能像調用自己機器上的對象那樣去調用其他機器上的對象。當向遠程對象傳遞消息的時候,就需要通過對象序列化來傳送參數(shù)和返回值。對Java Bean來說,對象序列化也是必不可少的。Bean的狀態(tài)信息通常實在設計時配置的,這些狀態(tài)信息必須保存起來,供程序啟動的時候用,對象序列化就負責這個工作。
更多Java知識,Java視頻,Java教程盡在動力節(jié)點Java培訓,關注動力節(jié)點官方微信,獲得一手Java面試題。