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对象保存了下来,我们知道这一点就可以了。 

Java之serialVersionUID_第1张图片


好了,然后执行GameLoad类,执行结果如下:

Game loaded! —-> PositionX:842,PositionY:620
可以看出读档出来的坐标,和对象生成时的坐标是一致的。你隔几天几月几年以后,再运行GameLoad类,也还是这个坐标。

 

 

 

--------------------- 
作者:seabreezesuper 
来源:CSDN 
原文:https://blog.csdn.net/seabreezesuper/article/details/70141844 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(JAVA)