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 block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.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 block e.printStackTrace(); } } public static void main(String[] args) { SerializableDemo ser = new SerializableDemo(); // ser.saveObject(); ser.readObject(); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。