IO-序列化和反序列化

java序列化和反序列化

1.引入序列化

在程序中为了能直接以java对象的形式保存数据,然后重新获得该java对象,这就需要使用序列化

2.序列化:
①.把内存中的java对象数据,通过某种方式把对象存储到本地磁盘或者传递给其他网络节点,这个执行的过程称为序列化
②.将对象转化成二进制的过程
3.反序列化:
①.把磁盘文件中的对象数据或者网络节点中的对象数据,恢复成java对象的过程。
②.把序列化后生成的二进制数据转换成对象的过程。
4.为什么使用序列化?
 * 		序列化是一种处理对象流的机制,将对象的内容进行流化,可以对流化后的数据进行读写操作
 * 		序列化就是为了解决对象流读写操作所引发的问题。
5.序列化的优点
* 		①.对于远程调用能方便对对象进行编码和解码,就像实现对象直接传输。
* 		②.可以将对象持久化到磁盘等介质中,就像实现对象直接存储。(一般是对于NOSQL)
6.如何实现序列化
 * 		①.实现序列化只需要实现一个接口 Serializable
* 		②.Serializable接口中没有任何方法,只要实体类实现此接口,JVM就认为此类可被序列化,这就是一种默认的序列化机制
* 		③.如果项目升级或者修改(增加属性或者减少属性),会引发反序列异常
* 		    解决方案:在JavaBean对象增加serialVersionUID字段,用来固定版本,无论怎么修改,版本都是一致的,才能进行反序列。

创建一个实体类(Student)实现Serializable接口

public class Student implements Serializable{
	
	// 序列化版本ID
	private static final long serialVersionUID = -5831565521782795983L;
	// 学号
	private int id;
	// 姓名
	private String name;
	// 性别
	// transient 标注此属性不需要序列化
	private transient char sex;
	
	private String address;
	
	public Student() {
		
	}

	public Student(int id, String name, char sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}
	

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", address=" + address + "]";
	}


	

	
	

	
	
	
	
}

序列化:把内存中的对象写入到磁盘

// 序列化:把内存中的对象写入到磁盘
	@Test
	public void test1() throws IOException {
		// 创建一个集合
		List<Student> list = new ArrayList<Student>();
		list.add(new Student(1, "张三", '男'));
		list.add(new Student(2, "李四", '女'));
		list.add(new Student(3, "王五", '男'));
		list.add(new Student(4, "赵六", '女'));
		// 创建一个File对象
		File file = new File("src/student.dat");
		FileOutputStream fos = new FileOutputStream(file);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		// 将集合信息写入到文件中
		oos.writeObject(list);
		// 释放资源
		oos.close();
		
		
	}

反序列化:把磁盘中的数据加载到内存(重新加载对象)

	// 反序列化:把磁盘中的数据加载到内存(重新加载对象)
	@Test
	public void test2() throws IOException, ClassNotFoundException{
		// 创建反序列集合
		List<Student> arraylList = new ArrayList<Student>();
		// 读文件
		ObjectInputStream ois = new ObjectInputStream(
									new FileInputStream(new File("src/student.dat")));
		// 创建集合保存反序列化的学生对象
		List<Student> list = (List<Student>)ois.readObject();
		// 释放资源
		ois.close();
		for (Student student : list) {
			arraylList.add(student);
		}
		
		for (Student student : arraylList) {
			System.out.println(student);
		}
	}
发布了30 篇原创文章 · 获赞 0 · 访问量 1938

猜你喜欢

转载自blog.csdn.net/qq_38499019/article/details/104694937
今日推荐