1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          serializable(Java中Serializable接口的作用是什么)

          來源:互聯網轉載 時間:2024-05-13 18:32:34

          首先我們先看看Serializable接口里面有什么。這個接口啥也沒有,那么是如何做到將Java對象轉換為字節數組的呢?

          publicinterfaceSerializable{}

          我們來實踐一下,看看Serializable是如何序列化Java對象的.創建一個類SClass(序列化類),增加name和age兩個屬性,并創建Getter和Setter方法。

          publicclassSClass{privateStringname;privateIntegerage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}}

          再創建一個測試類,通過ObjectOutputStream將一個SClass對象寫入文件中,這個實際上就是一種序列化的過程;再通過ObjectInputSream將SClass對象讀取出來,這個實際上就是一個返序列化的過程。

          publicclassTest{publicstaticvoidmain(String[]args){//初始化SClasssclass=newSClass();sclass.setName("王二");sclass.setAge(18);System.out.println(sclass);//把對象寫到文件中try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("file"));){oos.writeObject(sclass);}catch(IOExceptione){e.printStackTrace();}//從文件中讀出對象try(ObjectInputStreamois=newObjectInputStream(newFileInputStream(newFile("file")));){SClasssclass1=(SClass)ois.readObject();System.out.println(sclass1);}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();}}}

          由于SClass沒有實現Serializable接口,所以系統會報錯。

          順著堆棧信息,我們來看一下 ObjectOutputStream 的 writeObject0() 方法。其部分源碼如下:

          if(objinstanceofString){writeString((String)obj,unshared);}elseif(cl.isArray()){writeArray(obj,desc,unshared);}elseif(objinstanceofEnum){writeEnum((Enum<?>)obj,desc,unshared);}elseif(objinstanceofSerializable){writeOrdinaryObject(obj,desc,unshared);}else{if(extendedDebugInfo){thrownewNotSerializableException(cl.getName()+"\n"+debugInfoStack.toString());}else{thrownewNotSerializableException(cl.getName());}}

          這段代碼的意思是,ObjectOutPutStream在序列化的時候,會判斷對象的類型,如果不是字符串、數組、枚舉、Serializable的湖錒,會拋出NotSerializableException。

          但是,如果SClass實現了Serializable接口的話,就可以被序列化和反序列化了。

          具體是怎么序列化的呢?

          以ObjectOutputStream為例,它在序列化的時候會依次調用writeObject()→writeObject0()→writeOrdinaryObject()→writeSerialData()→invokeWriteObject()→defaultWriteFields()。

          defaultWriteFields方法為真正將對象序列化的接口。

          那怎么反序列化呢?

          以 ObjectInputStream 為例,它在反序列化的時候會依次調用 readObject()→readObject0()→readOrdinaryObject()→readSerialData()→defaultReadFields()。

          defaultReadFields方法為真正將對象反序列化的接口。

          所以Serializable接口僅僅是起到了標識的作用,告訴程序,他可以被序列化。

          其他知識點:

          1. static 和 transient 修飾的字段是不會被序列化的。

          因為序列化保存的是對象的狀態,而 static 修飾的字段屬于類的狀態,因此可以證明序列化并不保存 static 修飾的字段。

          transient 的中文字義為“臨時的”(論英語的重要性),它可以阻止字段被序列化到文件中,在被反序列化后,transient 字段的值被設為初始值,比如 int 型的初始值為 0,對象型的初始值為 null。

          2. 除了 Serializable 之外,Java 還提供了一個序列化接口 Externalizable(念起來有點拗口)。

          3. serialversionuid 被稱為序列化 ID,它是決定 Java 對象能否反序列化成功的重要因子。在反序列化時,Java 虛擬機會把字節流中的 serialVersionUID 與被序列化類中的 serialVersionUID 進行比較,如果相同則可以進行反序列化,否則就會拋出序列化版本不一致的異常。

          看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注本站行業資訊頻道,感謝您對本站的支持。

          標簽:serializable-

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          (資料圖)隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如摩洛哥在哪,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!1、摩洛哥王國是非洲西北部的一個君主制國家。其東部與阿爾及利亞接壤,南部其實際控制的西撒哈拉地區與毛里塔尼亞緊鄰,西部濱臨大西洋,并向北隔直布羅陀海峽和地中海與葡萄牙、西班牙相望。1979年摩洛哥占領西撒哈拉,但其在西撒哈拉的權利要求一直未被...

          亞洲金融危機是指發生于哪一年?亞洲金融危機發生在1997年,它最開是席卷了泰國,此后波及到日本、新加坡、韓國等等國家,導致貨幣、股市大幅度下跌,造成經濟甚至政治危機。整個亞洲金融危機分為三個階段,直到1999年才結束。金融危機是指金融投資、金融市場以及金融機構的危機,是金融界的一種術語,其具體的表現情況就是金融資產價格大幅度下降或者大部分金融易購倒閉、臨近破產等等,是整個經濟體系的大災難。1998...

          (資料圖片)在生活中,很多人都不知道無錫有哪些歷史名人是什么意思,其實他的意思是非常簡單的,下面就是小編搜索到的無錫有哪些歷史名人相關的一些知識,我們一起來學習下吧!無錫有以下歷史名人:1、顧憲成:明代思想家,東林黨領袖。2、泰伯:吳國第一代君主,東吳文化的宗祖。3、仲雍:吳國第二代君主,吳地和常熟的始祖。3、季簡:周代吳國的第三任君主。4、叔達:西周時期吳國第四任國君。5、周章:秦末農民起義軍將...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>