我们经常在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
版权声明:本文为博主原创文章,转载请附上博文链接!