【序列化】Serializable之SerialVersionUID

Serializable 

可序列化接口,打开jdk   java.io  Serializable,发现,Serializable下没有任何的实现,我们称这样的接口为标志性接口 ,如果某对象,不实现Serializable会报没有序列化异常

http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

Exception in thread "main" java.io.NotSerializableException: src.main.java.com.Io.user.User

什么是序列化

序列化,数据从内存到硬盘 

反序列化:数据从硬盘到内存

序列化版本

某个对象实现了Serializable,java虚拟机会对加上Serializable的对象做一些特殊的处理,就是加上版本号SerialversionUID(java虚拟机的特殊照顾,加上SerialversionUID)

package src.main.java.com.Io.user;
import java.io.Serializable;
public class Person implements Serializable {
    private String name;
    public Person (String name) {
       this.name= name;
    }
    @Override
    public String toString() {
       return "Person {" + "name='" + name+ '\'' + '}';
    }
}
package src.main.java.com.Io.SerialVersionUIDTest;
import src.main.java.com.Io.user.Person;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamTest {
    public static void main(String[] args) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));
        Person person = new Person("lhx");
        oos.writeObject(person);
        oos.flush();
        oos.close();
    }
}
package src.main.java.com.Io.SerialVersionUIDTest;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ObjectInputStreamTest02 {
    public static void main(String[] args) throws  Exception{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\Io\\ObjectOutputStreamTest02.DBF"));
        Ojbect object=ois.readObject();
        System.out.println(object);
        ois.close();
    }
}

这段代码本来没有问题,但是如果把Person.class删除,然后再次运行ObjectOutputStreamTest.java ,重新生成Person.class,这时候反序列化,是否可以成功,答案是不能,因为两次的SerialversionUID是不同的,下面是异常

java.io.InvalidClassException: com.master.CurrentMessages; local class incompatible:

stream classdesc serialVersionUID = -3227847930051618824,

local class serialVersionUID = -5813841892307787810

类中描述的serialVersionUID是-3227847930051618824  本地类中的是-5813841892307787810

两者不一致,导致的问题

怎么办

不让系统自动生成serialVersionUID ,而是手动写定一serialVersionUID (重点),这样,不管你的类如何升级,都不会产生序列化版本兼容问题。

public class Person implements Serializable {
    private static final long serialVersionUID = 5813841892307787810;
}

转载于:https://my.oschina.net/u/3523594/blog/1824019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值