Java中serialVersionUID的作用

我们有时需要将一个对象序列化,保存在本地,或者发送到网络,然后再反序列还原该对象。通常这种对象的类需要实现Serializable接口,在实现该接口时,一般需要提供一个静态变量,像这样子:

public class Throwable implements java.io.Serializable {private static final long serialVersionUID = -3042686055658047285L;

如果你定义的类实现了Serializable接口,但是没有提供一个serialVersionUID,像Eclipse这种IDE一般会提醒你要添加该静态变量,并且能帮助你自动生成。那么这个serialVersionUID的作用是啥呢?

当我们将一个对象序列化保存到本地,然后把类的某个成员变量修改了,或者添加了,你再反序列化该对象,能成功反序列化吗?如果没有serialVersionUID,,则自然是会报错的,但是,如果有该serialVersionUID变量,当你修改了某个成员变量的名字,或者添加了某个成员变量,或者添加修改了方法,都可以成功反序列化,此处注意一点,被修改了名字的变量名,其实就是相当于一个新变量名。总的来说,serialVersionUID的作用是为了保证对象序列化和反序列化时,类的版本的兼容,

下面给出一个例子,大家可以根据这个例子进行测试学习。

public class SerializableDemo extends Object implements Serializable {private static final long serialVersionUID = -3496979029493924435L;public byte b = 112;// int c = 32;public byte getB() {return b;}public void setB(byte b) {this.b = b;}public void saveObject() {try {FileOutputStream fos = new FileOutputStream(new File("E:\\demo2.txt"));ObjectOutputStream os = new ObjectOutputStream(fos);SerializableDemo s = new SerializableDemo();os.writeObject(s);os.flush();os.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void readObject() {try {FileInputStream fis = new FileInputStream(new File("E:\\demo2.txt"));ObjectInputStream ois = new ObjectInputStream(fis);SerializableDemo s2 = (SerializableDemo) ois.readObject();System.out.println(s2.getB());ois.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {SerializableDemo ser = new SerializableDemo();// ser.saveObject();ser.readObject();}}

今日的执着,会造成明日的后悔。

Java中serialVersionUID的作用

相关文章:

你感兴趣的文章:

标签云: