serialVersionUID的作用


 什么是serialVersionUID ?

serialVersionUID表示:“串行化版本統一標識符”(serial version universal identifier),簡稱UID

serialVersionUID必須定義成下面這種形式:static final long serialVersionUID = xxxL;

serialVersionUID 用來表明類的不同版本間的兼容性。有兩種生成方式: 一個是默認的1L;另一種是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段 。

 

java類中為什么需要重載 serialVersionUID 屬性?
當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換為字節序列,

才能在網絡上傳送;接收方則需要把字節序列再恢復為Java對象。 把Java對象轉換為字節序列的過程稱為對象的序列化,把字節序列恢復為Java對象的過程稱為對象的反序列化。 

  對象的序列化主要有兩種用途: 
  1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中; 
  2) 在網絡上傳送對象的字節序列。 
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。 java.io.ObjectInputStream

代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,並將其返回。 只有實現了Serializable或Externalizable接口的類的對象才能被序列化。

Externalizable接口繼承自Serializable接口,實現Externalizable接口的類完全由自身來控制序列化的行為,而僅實現Serializable接口的類可以采用默認的序列化方式 。 凡是實現Serializable接口

的類都有一個表示序列化版本標識符的靜態變量:private static final long serialVersionUID; 類的serialVersionUID的默認值完全依賴於Java編譯器的實現,對於同一個類,用不同的Java編譯器編譯,

有可能會導致不同的serialVersionUID。顯式地定義serialVersionUID有兩種用途: 

  1)在某些場合,希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;在某些場合,不希望類的不同版本對序列化兼容,

因此需要確保類的不同版本具有不同的serialVersionUID。 

  2)當你序列化了一個類實例后,希望更改一個字段或添加一個字段,不設置serialVersionUID,所做的任何更改都將導致無法反序化舊有實例,並在反序列化時拋出一個異常。

如果你添加了serialVersionUID,在反序列舊有實例時,新添加或更改的字段值將設為初始化值(對象為null,基本類型為相應的初始默認值),字段被刪除將不設置。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM