为什么要有SerialVersionUID?

本文深入探讨了Java序列化机制中SerialVersionUID的作用及重要性,并通过实例演示了如何避免因类结构变更导致的序列化异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要有SerialVersionUID?应该说为什么要手动声明一个ServialVersionUID。因为只要你做了序列化了,JAVA就会自动给你加上一个SerialVersionUID。

Java强烈建议我们显式的声明一个SerialVersionUID,因为SerialVersionUID默认值的计算是根据类的各个方面得来的(属性,方法。。。)。

详情:http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html。

为什么要显式的声明一个SerialVersionUID,因为当你的修改了你的类(属性和方法),那么你当前类的默认SerialVersionUID(local  class serialVersionUID)就会改变,和你以前序列化到本地的SerialVersionUID( stream classdesc serialVersionUID )不同,那么你这时候反序列就会出错!抛出异常java.io.InvalidClassException!

下面举例说明:

创建Test.java,敲入一下代码:

import java.io.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
class Person implements Serializable{
  private static final long serialVersionUID = 2;
  private String name;
  private String address;
  public String getName(){
    return name;
  }
  public void setName(String name){
    this.name = name;
  }
  public String getAddress(){
    return address;
  }
  public void setAddress(String address){
    this.address =address;
  }
  
}


class SerialVersionUIDTest{ 
  public static void main(String[] args) throws Exception{
    Person person = new Person();
 		person.setName("hackingwu");
 		ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("test"));
 		oo.writeObject(person);
 		oo.close();
    ObjectInputStream oi = new ObjectInputStream(new FileInputStream("test"));
    Person person_back = (Person)oi.readObject();
    System.out.println("HI,My name is "+person_back.getName());
    oi.close();
  }
}
terminal中javac Test.java编译完以后 没有语法错误以后java SerialVersionUIDTest,打印出“Hi,My name is hackingwu'.

接着你将你的person中添加一个属性”private int age;“

在把SerialVersionUIDTest类把序列化的代码去掉,即

class SerialVersionUIDTest{ 
  public static void main(String[] args) throws Exception{
    
    ObjectInputStream oi = new ObjectInputStream(new FileInputStream("test"));
    Person person_back = (Person)oi.readObject();
    System.out.println("HI,My name is "+person_back.getName());
    oi.close();
  }
}
把你之前存储在文件的对象凡序列出来,他就会报类似以下的错误;
Exception in thread "main" java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8903762676869424108, local class serialVersionUID = -2818023061976787765
所以你明白SerialVersionUID显式的声明出来把。

试一下显式的声明,这个异常就能消失了,声明成1,2都可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值