Serializable

1. 序列化和反序列化java

将对象转换为字节序列的过程称为对象的序列化。 反过来,将字节序列恢复成对象的过程称为对象的反序列化。数据库

2. 为何要用序列化缓存

2.1当咱们须要将内存中的对象存储到一个文件\数据库中的时候 一般咱们须要将某些对象进行序列化,让它离开内存空间,入驻物理硬盘,以便长期保存,须要的时候在调取它。例如:缓存,咱们须要将缓存存储起来,须要的时候再将它取出来。 2.2须要在网络上传送对象的时候 当两个进程在进行远程通讯时,彼此时间须要发送数据,不管哪一种类型的数据,都会以二进制序列的形式在网络上传送。网络

3. 实例app

3.1建立User对象并实现Serializable接口测试

public class User implements Serializable{

	/** 序列ID */
	private static final long serialVersionUID = 8364239647574512618L;

	private Integer id;
	
	private String name;

3.2写测试代码this

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
import model.User;


public class TestUserSerializable {

	@Test
	public void test() throws InstantiationException, IllegalAccessException {
		//序列化
		this.UserSerializable();
		//反序列化
		User user=this.UnUserSerialiable();
		System.out.println(user);
	}
	
	
	/**
	 * 序列化User对象
	 * 
	 * 1.经过反射建立对象
	 * 
	 * 2.建立对象输出流,调用writeObject(Object obj)方法
	 * 
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public void UserSerializable() throws InstantiationException,IllegalAccessException{

		User user=new User();
		try {
			//经过反射建立User对象
			Class<?> clazz=Class.forName("model.User");
			user=(User) clazz.newInstance();
			user.setId(1);
			user.setName("张三");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		ObjectOutputStream oos=null;
		try {
			StringBuffer path=new StringBuffer();
			String str="E:\\Test\\";
			File file=new File(str);
			if (!file.exists()) {
				file.mkdirs();
			}
			path=path.append(str).append("User.txt");
			//建立对象输出流
			//将序列化的user存入E:\Test\User.txt
			oos=new ObjectOutputStream(new FileOutputStream(path.toString()));
			oos.writeObject(user);
			System.out.println("对象序列化成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public User UnUserSerialiable() throws InstantiationException,IllegalAccessException{
		
		User user=new User();
		ObjectInputStream ois=null;
		try {
			//反序列化
			ois=new ObjectInputStream(new FileInputStream(new File("E:\\Test\\User.txt")));
			try {
				user=(User) ois.readObject();
				System.out.println("反序列化成功!");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return user;
		
	}
}

测试结果

4. serialVersionUID的做用code

Java的序列化机制是经过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,若是相同就认为是一致的,能够进行反序列化,不然就会出现序列化版本不一致的异常。对象

4.1经过Test单独测试UserSerializable(注释serialVersionUID)接口

输入图片说明 输入图片说明

4.2修改User属性,这时再反序列化

增长age属性 测试结果

相关文章
相关标签/搜索