你真的了解java序列化嗎
- 2019 年 11 月 1 日
- 筆記
問:可是我這個實體類,沒有實現序列化那個介面,也能存到資料庫,這是為什麼呢?
想不通!我是用的註解和hibernate框架弄的!
難道說不實現序列化介面也能保存數據?不應該啊。
@Entity public class Person { @Id @GeneratedValue private Integer id; private String name; private Integer age; }
答:你用habernate保存數據,只要XML文件配置好了,實體類DAO層都沒錯,調用SAVE方法 然後COMMIT就可以保存數據。
序列化主要就是把你要保存的數據,轉換成位元組碼的形式,反序列化就是把位元組碼變成數據。
你直接把數據通過本機伺服器提交給硬碟,確實不需要序列化。
但是你在網路傳輸的時候就不行了,你傳給別人一個東西,它接收了所有的位元組碼之後,卻不知道你原本傳的是什麼對象,也就沒法把這個東西按照原始去解析。
你序列化之後,在傳給對方,他接收到的時候會按照序列化特定的模式,給反序列化出來,也就是說你傳了什麼,對方接收的也是什麼,解析成功,可以正確使用方法以及屬性。
追問:你沒明白我的意思,我不是問什麼叫序列化
我問你我沒實現序列化介面Serializable
為什麼還可以保存對象到資料庫呢?
追答:本來就是可以保存的啊。你想想最開始學習資料庫和JAVA的時候,我們直接寫類,寫保存方法,然後連接資料庫,保存數據,當時的對象屬性,不也是沒有序列化就直接保存的嗎。
實體類只是表的抽象形式而已。理所當然可以保存啊。
保存數據 本來就和序列化沒有關係。。。
連接資料庫,調用保存方法,沒有異常直接提交,然後關閉連接,無論你用hibernate還是以前的,或者SSH框架,都是一個道理。 提交數據只是事物在沒有發生異常的時候,成功把JAVA里模擬的數據根據對應的表欄位存儲到表中。 它和序列化,沒有一點關係。
追問:就是說 實體類保存的只是各個屬性的欄位到資料庫。所以不需要序列化
而且也沒有對象參與其中,所以實體類和資料庫之間的操作不實現Serializable介面也可以
也就是說保存到資料庫的不是對象!而是數值數據而已
追答:你這個問題問的好,其實我前面已經說過了。。。
保存本身只是保存數據,但是你有了序列化,就是按照一定標準,方式去保存。
追問:現在明白了,我把單純的保存數據和保存對象搞混了
那是不是可以這麼理解
比如 單純的數據: 你好
保存對象: 張三 你好(假設張三是對象)
也就是說保存對象,就是多了一個對象+所有屬性欄位
而單純保存數據,就是只保存所有屬性欄位
追答:這個說法也不是很正確。 所謂的保存對象,換句話說無法實現。。。本來保存的就是數據。
對象是什麼?是記憶體地址中分配出來的一塊區域,裡面有堆和棧的。。分別用來記錄對象,類,屬性這些東西。但是它只是一個臨時的存儲空間,你想啊,記憶體區域劃分的空間。對吧。
對象是無法保存的,保存的只是對象里對應欄位的數據,因為實體類本身就是表欄位的抽象而已。
序列化你記住,就是單純的一種保存數據的模式。。有了它,在網路傳輸中安全,而且百分百解析。
追問:這樣啊,那對象不能保存的話,但是可以模擬記錄下這個吧,比如不是有個序列化uid那個嘛
那個標誌是不是就代表這個對象,按你說的對象沒法保存,但是我可以自己生成一個id標記,
這樣就能把所有欄位和屬性都歸到這個標記下面,然後通過網路傳輸到另一邊。那邊收到後
對比id標記,發現是一樣的,然後開始恢復所有的屬性,成功的保存傳輸了對象!
追答:你的表中有標識列對吧,hibernate配置的XML文檔,本來就對標識列和實體類對應標識列的欄位有處理的啊,你保存下來肯定也是對應的呀。
至於保存的是什麼,我應該是說錯了,保存的確實是對象。具體說是保存了對象中封裝的欄位,不過書上說的是保存了對象。。
追問:你誤會了 我現在說的不是資料庫的對應標識了
我說的是保存對象的標識
你應該知道實現Serializable介面後,不是都有一個uid嘛
加上你剛才說的對象只是一個臨時記憶體地址,不能保存不是嗎
所以我們自己創造一個uid標識這個對象,不就能保存對象了嘛
我是問的uid是不是這個意思,現在不說資料庫的事了,就是傳輸對象
追答:這個我還真不好回答你了。
序列化某個類的時候,下面不是出現個黃色提示嗎,我直接點它,然後就出來這個uid了,以及對應的數值,具體什麼作用,這個不清楚了。
追問:看來越往底層就越深奧了。但我感覺應該就是和你說的那個對象沒法保存有關係。你想對象沒法保存,那靠什麼來標識對象,總要有個標記對吧?於是jvm自動根據哈希值生產一個uid,通過網路傳輸到對方去,對方那邊接收到uid後,會和本地的對象uid對比,只要不吻合,就會反序列化對象更新數據。軟體的版本更新都這麼弄的,只要uid相同證明沒改動,uid不一樣,就證明有新版本可以更新的
追答:暈呀,我感覺不要追的這麼深吧,其實到這個層面就不是我們該學習的了。
它每次更新也好,其中什麼微小的改動,都是符合SUN公司設計的體系的,就是JAVA整個體系架構
我們作為程式設計師,不用去看到如此深層的東西呀!
不過反觀這個UID,也許你的猜測是對的吧,它有可能是通過這種方式來校正的,算是排除法吧。
如果文章對您有幫助,請記得點贊關注喲~
歡迎大家關注我的公眾號<情系IT>,每日技術推送文章供大家學習參考。