Serializable
Serializable
非常夏日i 发表于1年前
Serializable
  • 发表于 1年前
  • 阅读 8
  • 收藏 1
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

1. 序列化和反序列化

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

2. 为什么要用序列化

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

3. 实例

3.1创建User对象并实现Serializable接口


public class User implements Serializable{

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

	private Integer id;
	
	private String name;
	

3.2写测试代码

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的作用

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

4.1通过Test单独测试UserSerializable(注释serialVersionUID)

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

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

增加age属性 测试结果

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 6
博文 37
码字总数 20487
×
非常夏日i
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: