只會(huì)敲代碼。渤早。职车。。一直都用java的序列化鹊杖,卻沒考慮過java的序列化究竟是干什么的悴灵。
我們知道,java是跨平臺(tái)語言骂蓖,為什么跨平臺(tái)积瞒?是因?yàn)閖ava程序編譯后是class文件,class文件最終被java虛擬機(jī)解析成字節(jié)碼文件登下,可以運(yùn)行在任何平臺(tái)上茫孔。
對(duì)應(yīng)的,如果我們想要在網(wǎng)絡(luò)上進(jìn)行文字傳輸被芳,或者想要將程序內(nèi)存中的對(duì)象寫入到硬盤缰贝,可以用任何的虛擬機(jī)進(jìn)行解析讀取。也需要一個(gè)共同識(shí)別的方式畔濒,字節(jié)碼JG纭!篓冲!而我們的java序列化就是將java內(nèi)存中對(duì)象屬性的值進(jìn)行字節(jié)碼轉(zhuǎn)換李破。
Java平臺(tái)允許我們?cè)趦?nèi)存中創(chuàng)建可復(fù)用的Java對(duì)象,但一般情況下壹将,只有當(dāng)JVM處于運(yùn)行時(shí)嗤攻,這些對(duì)象才可能存在。即诽俯,這些對(duì)象的生命周期不會(huì)比JVM的生命周期更長(zhǎng)妇菱。但在現(xiàn)實(shí)應(yīng)用中承粤,就可能要求在JVM停止運(yùn)行之后能夠保存(持久化)指定的對(duì)象,并在 將來重新讀取 被保存的對(duì)象闯团。Java對(duì)象序列化就能夠幫助我們實(shí)現(xiàn)該功能辛臊。必須注意地是,對(duì)象序列化保存的是對(duì)象的"狀態(tài)"房交,即它的成員變量彻舰。
由此可知,對(duì)象序列化不會(huì)關(guān)注類中的 靜態(tài)變量候味。
除了在持久化對(duì)象時(shí)會(huì)用到對(duì)象序列化之外刃唤,當(dāng)使用RMI(遠(yuǎn)程方法調(diào)用),或在網(wǎng)絡(luò)中傳遞對(duì)象時(shí)白群,都會(huì)用到對(duì)象序列化尚胞。Java序列化API為處理對(duì)象序列化提供了一個(gè)標(biāo)準(zhǔn)機(jī)制。
那么序列化的字節(jié)碼和.class文件字節(jié)碼是否是一樣的呢帜慢?答案否笼裳。
序列化保存的是對(duì)象屬性的值。由程序解析使用粱玲。
class字節(jié)碼是類的屬性信息(類型躬柬、作用域、static或非static)和方法的信息(方法的簽名信息密幔、方法體的內(nèi)容)及其他信息楔脯,由虛擬機(jī)解析使用。
簡(jiǎn)而言之:序列化的作用就是為了 不同jvm之間 共享實(shí)例對(duì)象 的一種解決方案.由java提供此機(jī)制,效率之高,是其他解決方案無法比擬的.
如何實(shí)現(xiàn)java序列化胯甩?
1. 基于Serializable接口的序列化昧廷。
Java中,只要一個(gè)類實(shí)現(xiàn)了java.io.Serializable接口偎箫,那么它就可以被序列化木柬。
如果僅僅只是讓某個(gè)類實(shí)現(xiàn)Serializable接口,而沒有其它任何處理的話淹办,則就是使用 默認(rèn)序列化機(jī)制眉枕。使用默認(rèn)機(jī)制,在序列化對(duì)象時(shí)怜森,不僅會(huì)序列化當(dāng)前對(duì)象本身速挑,還會(huì)對(duì)該對(duì)象引用的其它對(duì)象也進(jìn)行序列化,同樣地副硅,這些其它對(duì)象引用的另外對(duì)象也將被序列化姥宝,以此類推。所以恐疲,如果一個(gè)對(duì)象包含的成員變量是容器類對(duì)象腊满,而這些容器所含有的元素也是容器類對(duì)象套么,那么這個(gè)序列化的過程就會(huì)較復(fù)雜,開銷也較大碳蛋。
@Transient 關(guān)鍵字:當(dāng)某個(gè)字段被聲明為@Transient后胚泌,默認(rèn)序列化機(jī)制就會(huì)忽略該字段。
2.基于Externalizable接口的序列化
Externalizable繼承于Serializable肃弟,當(dāng)使用該接口時(shí)玷室,序列化的細(xì)節(jié)需要由程序員去完成。
要對(duì)writeExternal()與readExternal()方法進(jìn)行手動(dòng)處理愕乎。
參考:
https://www.cnblogs.com/qq3111901846/p/7894532.html
http://www.reibang.com/p/94d8a599bbeb
http://www.reibang.com/p/3556e7806d8c