什麼是 Java 序列化?

Mondo 科技 更新 2024-01-30

問:什麼是 j**a 序列化?

乙個:J**A 提供了兩種持久化物件的方法,即序列化和外部序列化。

序列化

在分布式環境中,當遠端通訊時,無論哪種型別的資料以二進位順序通過網路傳輸。 序列化是將物件描述為一系列位元組的過程,以解決讀取和寫入物件流時出現的問題。序列化可以將物件的狀態寫入流進行網路傳輸,也可以將其儲存到檔案、資料庫或其他系統中,並在需要時讀出流以重建相同的物件。

你是怎麼做到的?事實上,所有要序列化的類都必須實現 Serializable 介面,該介面位於 J**A 中lang 包,它不包含任何方法。 使用輸出流(例如 FileOutputStream)構造 ObjectOutputStream 物件,然後使用該物件的 WriteObject(ObjectObJ) 方法寫出 ObjectOutput 物件(即儲存其狀態)並使用其對應的輸入流進行恢復。

序列化有兩個特點:

1)如果乙個類可以序列化,那麼它的子類也可以序列化。

2)由於static表示類的成員transient(j**a關鍵字),如果用transient宣告例項變數,則在儲存物件時不需要維護其值。) 表示物件的臨時資料,因此不能將其序列化為這兩種型別的資料的成員。

J**A 提供了多個物件序列化介面,包括 ObjectOutput、ObjectInput、ObjectOutputStream 和 ObjectInputStream。

由於使用序列化會影響系統的效能,因此在沒有必要時不應使用它。那麼,何時需要使用該序列化呢?

1)物件需要通過網路傳送,或者物件的狀態需要持久化到資料庫或檔案中。

2)序列化可以實現深度複製,即可以複製被引用的物件。

序列化的對立面是反序列化,它將流轉換為物件。 在序列化和反序列化的過程中,serialversionuid 起著非常重要的作用,每個類都有乙個特定的 serialversionuid,在反序列化的過程中,類的相容性由 serialversionuid 決定。 如果待序列化物件的serialversionuid與目標物件的serialversionuid不同,則在反序列化時會丟擲invalidclassexception。 作為乙個好的程式設計習,最好在序列化類中顯式宣告serialversionuid(此欄位必須定義為靜態final)。 自定義 serialversionuid 具有以下三個優點:

提高程式的執行效率。 如果未在類中顯式宣告 SerialVersionuid,則在序列化時計算 SerialVersionuid 值。 通過顯式宣告 serialversionuid,省略了計算過程,從而提高了程式的效率。

提高程式在不同平台上的相容性。由於每個平台的編譯器在計算 serialversionuid 時完全有可能使用不同的計算,因此不可能在另乙個平台上反序列化乙個平台上序列化的物件。 可以通過顯式宣告 SerialVersionUid 來避免此問題。

增強程式所有版本的相容性。預設情況下,每個類都有乙個唯一的 SerialVersionUid,因此當以後對類進行修改時(例如通過新增新屬性),該類的 serialVersionuid 的值將發生變化,這將導致該類在修改前序列化的檔案在修改後被反序列化。 同樣,這將通過顯式宣告 SerialVersionuid 來解決。

外部序列化。

J**a 語言還提供了另一種實現物件持久化的方法,即外部序列化。介面如下:

外部序列化和序列化之間的主要區別在於序列化是內建的API,只需要實現可序列化的介面,開發者不需要寫任何**來實現物件的序列化,而使用外部序列化時,可外部化介面中的讀寫方法必須由開發者實現。因此,使用 externalizable 編寫程式比實現可序列化介面更困難,但由於它將控制權交到開發人員手中,因此程式設計具有更大的靈活性,並且控制那些需要持久化的屬性的能力可能會提高效能。

擴充套件:序列化可序列化時,該類中的所有屬性都會被序列化,那麼如何只序列化部分屬性呢?

一種方法實現了可外部化的介面,開發者可以根據實際需要實現readexternal和writeexternal方法來控制用於序列化和反序列化的屬性,這樣做的缺點是增加了程式設計的難度。 執行此操作的另一種方法是使用關鍵字 transient 來控制序列化的屬性。 由瞬態修改的屬性是臨時的,不會序列化。 因此,可以修改不需要使用瞬態序列化的屬性。

相關問題答案

    Apache OfBiz反序列化命令執行漏洞(CVE 2023 49070)。

    專案介紹 Apache Ofbiz 是乙個非常知名的電子商務平台,也是乙個知名的開源專案,為構建大中型企業 跨平台 跨資料庫 跨應用伺服器提供了基於最新 JEE XML 規範和技術標準的多層分布式電子商務 Web 應用系統的框架。Ofbiz 的主要特點是 Ofbiz 提供了一整套用於開發基於 J A...

    高效能多語言序列化框架 Fury

    github位址 FURY是乙個基於JIT動態編譯和零拷貝的多語言序列化框架,提供極致的效能和易用性 它支援主流程式語言J A Python C Golang J Ascript,其他語言都可以輕鬆擴充套件。統一的多語言序列化核心能力 高度優化的序列化基元。零拷貝序列化支援 帶外序列化協議和堆外記憶...

    什麼是序列到序列RNN?

    RNN 通過按順序處理資料來處理可變長度的輸入,一次乙個步驟。與其他需要固定輸入的神經網路不同,RNN 可以適應不同長度的序列。它們遍歷輸入序列,保持隱藏狀態,攜帶來自先前時間步的資訊。這使得 RNN 能夠處理不同大小的輸入並捕獲整個系列的依賴關係。RNN 的架構由迴圈連線組成,使資訊能夠從乙個步驟...

    什麼是預膠化澱粉(玉公尺)。

    預膠化澱粉是一種改性澱粉,廣泛應用於醫藥 食品 石油 鑄造 造粒 化工 紡織等眾多行業,具有良好的發展前景。嘉禾節能材料 生產的預膠化澱粉包括玉公尺預膠化澱粉 木薯預膠化澱粉 小麥預膠化澱粉 糯公尺預膠化澱粉 馬鈴薯糊化澱粉 有機粘結劑 鑽井液過濾還原劑 鑄造 澱粉 冶金球團粘結劑 飼料新增劑 肥料...

    什麼是預膠化澱粉(木薯澱粉)。

    預膠化澱粉是預膠化處理後具有良好水溶性 粘度和成膜效能的改性澱粉,廣泛應用於醫藥 食品 化工等領域。預膠化澱粉的特點 增稠粘結,冷水溶解,綠色環保。我公司生產玉公尺預糊化澱粉 木薯預糊化澱粉 石油鑽井過濾還原劑 鑄造澱粉 冶金球團粘結劑 型煤粘結劑 飼料新增劑 肥料造粒粘結劑等產品,我公司目前擁有條...