序列化和反序列化中serialVersionUID的作用

1、基本概念

把对象转换为字节序列的过程称为对象的序列化

把字节序列恢复为对象的过程称为对象的反序列化

2、实现方式:

两种方式:其一,实现Serializable接口;其二,实现Externalizable接口

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式

基于Serializable接口是通过操作ObjectOutputStream类和ObjectInputStream类实现的

基于Externalizable接口是通过操作ObejectOutput类和ObjectInput类实现的

3、主要用途:

对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

对象序列化的本质是将对象的状态通过有序字节流进行保存或传输,由此,静态变量是类变量,属于整个类,并非专属于每个对象实例,因此,不序列化静态变量。瞬时变量,指的是被transient关键字修饰的变量,该关键字表示为瞬时的,即不做持久化处理的,以此来控制属性是否被包含进入序列化的字节流中。因此,在序列化时,排除transient关键字修饰的属性

/**
 * MethodName: SerializeCustomer 
 * Description: 序列化Customer对象
 * @author pcchen
 * @throws FileNotFoundException
 * @throws IOException
 */
private static void SerializeCustomer() throws FileNotFoundException,
		IOException {
	Customer customer = new Customer("顾客", 25);
	// ObjectOutputStream 对象输出流
	ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
			new File("E:/Customer.txt")));
	oo.writeObject(customer);
	System.out.println("Customer对象序列化成功!");
	oo.close();
}

/**
 * MethodName: DeserializeCustomer Description: 反序列Customer对象
 * 
 * @author pcchen
 * @return
 * @throws Exception
 * @throws IOException
 */
private static Customer DeserializeCustomer() throws Exception, IOException {
	ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
			new File("F:/Customer.txt")));
	Customer customer = (Customer) ois.readObject();
	System.out.println("Customer对象反序列化成功!");
	return customer;
}


4、serialVersionUID的作用

s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
serialVersionUID有两种生成方式:
1、采用这种方式生成的serialVersionUID是1L
2、采用这种方式生成的serialVersionUID是根据类名,接口名,方法和属性等来生成的
        private static final long serialVersionUID = 4603642343377807741L;
在bean(Custom类)例子中,没有指定Customer类的serialVersionUID的,那么java编译器会自动给这个class进行一个摘要算法,类似于指纹算法,只要这个文件 多一个空格,得到的UID就会截然不同的,所以反序列化,如果自己指定serialVersionUID,则修改了Custom中的变量的信息都是争取的,如果没有自己指定serialVersionUID,那么修改属性后,反序列化,就会报错。
     Exception in thread "main" java.io.InvalidClassException



详细文章链接1
详细文章链接2

你可能感兴趣的:(java)