<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java 中反序列化過程如何發生? > 原文: [https://howtodoinjava.com/java/serialization/how-deserialization-process-happen-in-java/](https://howtodoinjava.com/java/serialization/how-deserialization-process-happen-in-java/) 在我上一篇與“[**在 Java 中實現`Serializable`接口的指南**](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in java")”相關的文章中,Bitoo 先生問了一個好問題:“在反序列化時,**JVM 如何創建 JVM 沒有調用構造器的對象?**”。 我曾想在評論中的同一帖子中回復他,但又過一會兒,我想到了這個非常有趣的話題,需要另外撰寫詳細的文章,并與大家進行討論。 因此,在這里,我將以對這一主題的有限知識開始討論,并鼓勵大家提出您的想法/疑問,以便使我們所有人都清楚這個主題。 我從這里開始。 我們已經介紹了許多與 Java 中的**序列化**相關的內容,以及與 Java 中的反序列化相關的一些內容。 我將不再重復同一件事,而是直接進入主要討論主題,即反序列化如何在 Java 中工作? **反序列化是將先前序列化的對象重建回其原始形式(即對象實例)的過程**。 反序列化過程的輸入是字節流,它是從網絡的另一端獲取的,或者我們只是從文件系統/數據庫中讀取字節流。 立即出現一個問題,在此字節流中寫入了什么? > **閱讀更多信息**:[用于實現`Serializable`接口的迷你指南](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in java") 確切地說,字節流(或稱序列化數據)具有有關由序列化過程序列化的實例的所有信息。 該信息包括類的元數據,實例字段的類型信息以及實例字段的值。 將對象重新構造回新的對象實例時,也需要相同的信息。 在反序列化對象時,JVM 從字節流中讀取其類元數據,該字節流指定對象的類是實現`Serializable`還是`Externalizable`接口。 請注意,要無縫進行反序列化,執行反序列化的 JVM 中必須存在要反序列化對象的類的字節碼。 否則,將拋出`ClassNotFoundException`。 這不是很明顯嗎? 如果實例實現了`Serializable`接口,則將創建類的實例而無需調用其任何構造器。 真? 那么如果不調用構造器,該如何創建對象呢? 讓我們看一個簡單的電子程序的字節碼: ```java public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } Byte code: public class SimpleProgram extends java.lang.Object{ public SimpleProgram(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello World! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return } ``` 上面的字節碼看起來很真實,不是嗎? 在第一行中,我們將把“局部變量表”中的值壓入棧。 在這種情況下,我們實際上只是將隱式引用推到“`this`”,因此它并不是最令人興奮的說明。 第二條指令是主要內容。 實際上,它**調用了最高級類的構造器,在上述情況下,它是`Object.java`**。 一旦調用了最高級類的構造器(即本例中的對象),其余的代碼就會執行用代碼編寫的特定指令。 符合以上概念,即最高級的構造器,我們在反序列化中也有類似的概念。 在反序列化過程中,要求實例的所有**父類均應可序列化; 如果層次結構中的任何超類都不可序列化,則它必須具有默認構造器**。 現在有道理了。 因此,在反序列化時,將首先搜索超類,直到找到任何不可序列化的類。 如果所有超類都可以序列化,那么 JVM 最終會到達`Object`類本身,并首先創建`Object`類的實例。 如果在搜索超類之間,發現任何無法序列化的類,則將使用其默認構造器在內存中分配實例。 如果要在不可序列化的情況下反序列化實例的任何超類,并且也沒有默認構造函數,那么JVM會拋出“`NotSerializableException`”。 另外,在繼續進行對象重建之前,JVM 會檢查字節流中提到的`serialVersionUID`是否與該對象類的`serialVersionUID`相匹配。 如果不匹配,則拋出“`InvalidClassException`”。 > **閱讀更多內容**:[Java 中的`SerialVersionUID`以及相關的快速知識](//howtodoinjava.com/java/serialization/serialversionuid-in-java-and-related-fast-facts/ "SerialVersionUID in java and related fast facts") 因此,到目前為止,我們使用超類的默認構造器之一將實例保存在內存中。 請注意,此后將不會為任何類調用構造器。 執行超類構造器后,JVM 讀取字節流并使用實例的元數據來設置實例的類型信息和其他元信息。 創建空白實例后,JVM 首先設置其靜態字段,然后調用默認的`readObject()`方法(如果未覆蓋),否則會調用被覆蓋的方法,該方法負責將值從字節流設置為空白實例。 > **閱讀更多信息**:[`readObject()`和`writeObject()`的示例代碼](//howtodoinjava.com/java/serialization/transient-keyword-in-java-with-real-time-example/ "read object example") `readObject()`方法完成后,**反序列化過程完成**,您可以使用新的反序列化實例了。 請在評論區域中發表您對該主題的想法/看法/查詢。 這些絕對值得歡迎。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看