Java 序列化面試問題和答案 [適合初學者和有經驗者]

已發表: 2020-09-25

Java 是世界上最好的編程語言之一。 我們很幸運地看到 Java 隨著時間的推移而發展並成為我們今天所知道的廣受歡迎的語言。 這些在 Java 中進行的改進導致包含了一些非常重要的特性,這些特性定義了我們今天如何編寫程序。 這些功能之一是序列化。

本質上,序列化只是一種用於將對象存儲到內存中的機制。 因此,當我們說我們正在序列化一個對象時,我們的意思是我們正在將所討論的對像從狀態轉換為字節流。 這種從其本機狀態到字節流的轉換使得將這個對象寫入文件變得輕而易舉。

然後可以將此文件傳輸到我們希望的任何地方,並且要訪問對象及其功能,我們需要做的就是反序列化對象。 反序列化,顧名思義,是序列化的反面。 在這裡,我們將字節的流轉換為對象的本機狀態以使用該對象。

序列化使開發人員能夠以一定程度的靈活性編寫他們的代碼。 獲取對象並將其與其他地方的原生屬性一起使用的能力在當今的工作流程中至關重要。 難怪招聘人員希望他們的潛在員工更多地了解 Java 中的對象序列化。

無論您是否在項目中使用了序列化,您都不能僅僅讓它的重要性滑落。 因此,為了幫助您成為一名專業的 Java 開發人員,我們收集了一些引人入勝的 Java 序列化面試問題,您將在下面找到這些問題。

Java 序列化面試題

Q1。 在 Java 編程語言的上下文中,序列化是什麼意思?

答。 序列化的定義可能是 Java 序列化上下文中最基本但也是最常見的問題之一。 你將不得不回答這個問題幾乎是所有的採訪。 因此,您必須對 Java 序列化有一個好的定義。 因此,序列化只不過是用 Java 編寫的對像如何轉換為字節流。

這樣做的主要目的是使對象能夠轉移到另一台機器或將對象的狀態保存到文件中或將對象的狀態保存到數據庫中。 一旦對像被成功序列化,那麼我們只需反序列化對象就可以快速將對象恢復到昔日的輝煌。

Q2。 我們可以在 Java 中序列化對象的方式是什麼? 編寫一個程序來序列化和反序列化對象。

答。 在面試中,如果你能夠通過編寫程序來增強你的理論知識,那麼你被選中的機會就會自動增加。 還假設在任何面試中,您將被要求編寫一個基本程序(至少是一個基本程序),它演示了序列化和反序列化是如何發生的。 在你自己編寫這個程序之前,你需要記住關於 java 中對象序列化的一件關鍵事情。

要序列化一個對象,您需要編寫使用類 java.io.Serializable 接口的對象。 您需要確保為要序列化的類對象使用 Marker 接口。 這意味著有問題的類在該類中不應有任何書面方法。 這個類還需要告訴 Java 虛擬機,隨後的對象將不得不改變形式並形成字節流。

序列化的代碼寫在下面。

OutputStream fout = new FileOutputStream(“ser.txt”);

ObjectOutput oout = new ObjectOutputStream(fout);

系統。 out .println(“序列化過程已經開始,正在序列化員工對象……”);

out.writeObject(object1);

反序列化的代碼寫在下面。

InputStream fin= new FileInputStream(“ser.txt”);

ObjectInput oin= new ObjectInputStream(fin);

系統。 out .println(“反序列化過程已經開始,正在顯示員工對象……”);

僱員僱員;

emp=(員工) oin.readObject();

學習: Java 中的內存分配:您需要知道的一切

Q3。 Serialization 和 Externalizable 的接口有什麼區別?

答。 這個問題可能意味著您是否被選中擔任該工作之間的區別。 假設您設法以非常全面的方式回答了這個問題。 在這種情況下,面試官一定會對你對這個學科的了解留下深刻的印象,你被選中的機會就會自動飆升。 您將在下表中找到所有關鍵差異:

我們比較這兩種方法的屬性。
可序列化
可擴展的
這兩個不同接口的類中存在的方法這恰好是一個標記界面。 標記接口不能有任何成員函數。 它們必須是空的,除了它們需要有一條指令,它告訴 Java 虛擬機這個類的對象必須被轉換成字節流。 這不是製造商接口,這意味著它有一些成員方法。

它具有稱為writeExternal()readExternal()的方法

他們默認的序列化方式是什麼? 對於可序列化,您將找到一種可以序列化您編寫的對象的默認方式。 作為一名程序員,你需要做的就是找到一種方法,將這個接口集成到你的程序中。 您將找不到實現序列化的默認方式。 您將需要編寫自己的方法或覆蓋現有的方法。
他們實現序列化過程的方式是什麼? 您可以自定義在此接口中實現序列化的方式。 但是,您不能覆蓋現有方法。 您需要將這些方法實現到您自己的類中以獲得您想要的自由度。 在此方法中,您需要覆蓋默認方法。 所以如果你想實現一個自定義的方式來序列化對象,你應該選擇這個接口而不是默認的 Serializable 方式。
他們在序列化過程中提供的控製程度如何, 使用此界面時,您會發現一個很小的擺動空間。 您還需要將默認函數寫入您的類以充分利用此方法。 但是,您不必這樣做,這意味著您仍然可以使用此接口序列化對象,而無需將默認函數寫入自定義類。 該界面提供了對整個過程的出色控制。 僅出於這個原因,如果您使用此接口,則必須將這兩個方法寫入您的自定義類。
使用反序列化時使用的構造函數是什麼, 在序列化過程中沒有調用構造函數。 使用此接口序列化對象時,會調用承包商。

Q4。 編寫一個程序,在其中實現序列化和反序列化的自定義過程。

答。 棘手的部分來了。 通過這個問題,您可以通過實際用例場景展示所有以前的問題知識。 您能夠編寫這些程序的能力將清楚地展示您的專業知識並幫助您獲得想要的工作。

寫在下面,您將找到編寫 writeObject() 方法的自定義方式。

私人無效writeObject(ObjectOutputStream os){

系統。 out .println("In, writeObject() 方法。");

試試{

os.writeInt(這個.id);

os.writeObject(這個.name);

}捕捉(異常 e){

e.printStackTrace();

}

}

寫在下面你會發現去序列化的自定義實現。

私人無效讀取對象(ObjectInputStream ois){

系統。 out .println("In, readObject() 方法。");

試試{

id=ois.readInt();

名稱=(字符串)ois.readObject();

}捕捉(異常 e){

e.printStackTrace();

}

}

Q5。 您將如何使用 Externalizable 接口實現序列化和反序列化?

答。 要使用 externalizable 接口實現序列化和反序列化,您需要自己編寫函數 writeExternal() 和 readExternal()。 您將在下面找到兩者的代碼。

自定義 writeExternal() 方法

民眾 空白 writeExternal (ObjectOutput oo)拋出IOException {

系統。 out .println(“in writeExternal()”);

oo.writeInt(id);

oo.writeObject(name);

}

自定義 readExternal() 方法

民眾 空白 readExternal (ObjectInput in)拋出IOException,ClassNotFoundException {

系統。 out .println(“in readExternal()”);

這個.id=in.readInt();

這個.name=(String)in.readObject();

}

閱讀: 2020 年的 Python 與 Java:您應該選擇哪一個?

Q6。 假設您不希望序列化特定變量。 您將如何防止您不希望被序列化的成員變量?

答。 這是一個高度概念化的問題。 您需要了解靜態和非靜態變量才能快速回答這個問題。 假設您希望某個特定變量不被序列化。 在這種情況下,您必須將它們設為靜態,因為任何靜態變量的值都無法更改,因此,它們也不會被序列化。

問題 7。 serialVersionUID 是什麼意思?

答。 對於我們想要序列化的每個類,它們將被賦予一個類號。 這個數字,給每個要序列化的類,稱為serialVersionUID。 此 ID 是必不可少的,因為在以本機形式取回對象時,Java 虛擬機會查找與該對象關聯的 ID。

然後它快速引用應該序列化的類的 ID。 當它找到這個對象所屬的對應類時,反序列化過程就開始了。

Q8。 假設我們忘記提及或定義 serialVersionUID。 這個動作會對我們編寫的程序產生什麼影響?

答。 這個問題是另一個基本問題。 你需要一些紮實的知識才能正確回答這個問題。 我們首先需要澄清的是,serialVersionUID 用於對問題中的對象進行版本控制。 假設沒有為該類定義 ID,因此 Java 編譯器將不知道該對象屬於哪個類。 在運行時或序列化對象時,不會出現任何錯誤,因為本身不需要定義任何 ID。

但是,當我們想要將數據流轉換為對象時,Java 編譯器就會拋出錯誤。 編譯器將不知道該對象屬於哪個類,因此無法找到並連接與該對象關聯的所有成員函數和變量。 因為編譯器會卡在這一步,會拋出serialVersionUID mismatch (java.io.InvalidClassException)的錯誤。

問題 9。 如果我們無法序列化,或者序列化方法不可用,是否有任何其他方法可以通過網絡傳輸我們編寫的對象?

答。 有幾種方法可以讓我們通過網絡傳輸我們編寫的對象。 您會在下面找到其中一些。

  1. 您可以嘗試將對象轉換為 JSON 文件。 將對象轉換為 JSON 字符串並不難,當您編寫好 JSON 文件後,將其轉換為代碼文件也不是很困難。 因此,您可以傳輸通過網絡編寫的 JSON 字符串。
  2. 您還可以使用 Hibernate 工具(這是一個 ORM 工具)。 該工具允許對像在數據庫中持久存在。 然後寫入的對像以後也可以很容易地讀取。
  3. 您還可以使用 XML 技術。 您可以嘗試將對象轉換為 XML 文件,然後您可以通過網絡快速傳輸該文件。

必讀:前 24 個 Java 面試問題和答案

包起來

如果您有興趣了解有關 Java、OOP 和全棧軟件開發的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發 PG 文憑,該文憑專為在職專業人士設計,提供 500 多個小時的嚴格培訓,9 + 項目和任務、IIIT-B 校友身份、實用的實踐頂點項目和頂級公司的工作協助。

為未來的職業做準備

行業值得信賴的學習 - 行業認可的認證。
今天報名