Java之serialVersionUID

lvxiangan發表於2018-11-14

我們經常在JavaBean類遇到這樣一行程式碼:
  private static final long serialVersionUID = -1621157410689606874L;

它有什麼作用呢?帶著疑問,讓我們先來了解一下serialzable。
通常javabean類都會implements serialzable,serialzable顧名思義就是序列化,但“序列化”這詞有拗口了,我認為“物件存檔”更貼合它的原意。

序列化和反序列化的解析:
簡單來講,Java物件只存在於JVM中,當JVM退出時,物件也會被銷燬。序列化就是將物件以位元組形式存於他地,也有可能是檔案系統。反序列化就是通過這些位元組再次將Java物件重新構造出來。但是,這裡有一個關鍵,如何確保在這一過程中保持類不變?這時,我們就需要seriaVersionUID了。
seriaVersionUID就用以在反序列化的過程中驗證一個序列化物件的傳送方(序列化的人)和接收方(反序列化的人)收到的是同一類物件,即seriaVersionUID是否一致,如果一致,那麼我們認為他是同一物件,否則就認為不一致,丟擲InvalidClassException異常。
 

舉個例子:
儲存:使用Serializable(序列化介面)儲存所有狀態,序列化後你可以選擇將它儲存在你需要的位置。
讀取:讀取後生成的物件所有屬性將和原物件的屬性相同(只是記憶體地址不同)。這樣可以方便的將一個java物件寫入到磁碟中,儲存該物件的所有狀態!
 

假設我們開發一款“坦克大戰”的遊戲,我們要將遊戲中隨機生成的坦克的位置存檔起來,然後讀檔的時候再把該坦克在相應的位置顯示出來。 
■坦克類 (注意這個類必須實現Serializable 介面,這是關鍵)

import java.io.Serializable;
import java.util.Random;

public class Tank implements Serializable {
    private static final long serialVersionUID = 123456789L;
    public int positionX;
    public int positionY;

    public Tank() {
        Random rand = new Random();
        this.positionX = rand.nextInt(1024);
        this.positionY = rand.nextInt(768);
    }

    public void showPosition() {
        System.out.println("PositionX:" + this.positionX + "," + "PositionY:" + this.positionY);
    }
}

■遊戲存檔類(序列化類):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class GameSave {

    public static void main(String[] args) throws IOException {
        Tank tank = new Tank();
        FileOutputStream fos = new FileOutputStream("Tank.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(tank);

        System.out.print("Game saved!  ----> ");
        tank.showPosition();

        oos.flush();
        oos.close();
    }

}

■遊戲讀檔類(反序列化類):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class GameLoad {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        FileInputStream fis = new FileInputStream("Tank.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Tank tank = (Tank) ois.readObject();

        System.out.print("Game loaded! ----> ");
        tank.showPosition();

        ois.close();
    }

}
先執行GameSave類,執行結果如下:

Game saved! —-> PositionX:842,PositionY:620
開啟生成的Tank.txt,除了物件名和屬性名,全是亂碼,不過不要緊,程式順利把隨機生成的Tank物件儲存了下來,我們知道這一點就可以了。 


好了,然後執行GameLoad類,執行結果如下:

Game loaded! —-> PositionX:842,PositionY:620
可以看出讀檔出來的座標,和物件生成時的座標是一致的。你隔幾天幾月幾年以後,再執行GameLoad類,也還是這個座標。

 

 

 

--------------------- 
作者:seabreezesuper 
來源:CSDN 
原文:https://blog.csdn.net/seabreezesuper/article/details/70141844 
版權宣告:本文為博主原創文章,轉載請附上博文連結!