Java之serialVersionUID
我們經常在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
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- Java serialVersionUID 有什麼作用?JavaUI
- Java中serialVersionUID的解釋JavaUI
- serialVersionUID作用UI
- 深入理解Java序列化中的SerialVersionUidJavaUI
- serialVersionUID的作用UI
- 自動生成serialVersionUIDUI
- 序列化-serialVersionUID作用UI
- Intellij Idea 生成serialVersionUID的方法IntelliJIdeaUI
- 靜態long型別常量serialVersionUID的作用型別UI
- 注意由雙大括號匿名類引起的serialVersionUID編譯告警UI編譯
- Java 安全之Java AgentJava
- java之JAVA異常Java
- Java 之 JDBCJavaJDBC
- Java之ServletJavaServlet
- Java之MathJava
- Java之JDBCJavaJDBC
- java之介面Java
- java之switchJava
- Java之反射Java反射
- Java之StaticJava
- Java之容器Java
- Java之JDBC①JavaJDBC
- ?Java基礎之Java列舉Java
- java框架之mybatisJava框架MyBatis
- Java 之 JDBC(二)JavaJDBC
- Java加密之IVJava加密
- Java之試題Java
- Java之常用APIJavaAPI
- Java 集合之ArrayListJava
- Java集合之HashMapJavaHashMap
- Java集合之ArrayListJava
- java集合之CopyOnWriteArrayListJava
- Java NIO之BufferJava
- Java之JNDI注入Java
- Java 8 之 OptionalJava
- Java IO之NIOJava
- Java Socket 之 NIOJava
- Java之Properties集合Java