java序列化流:序列化与逆序列化

package com.qianfeng.test;

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 java.io.Serializable;

/*
 * 序列化流:将短期存储的数据实现长期存储的过程
 * 
 * 短期存储:数据存放在内存中,数据会随着程序的关闭而释放----对象,数组,集合,变量
 * 长期存储:数据存放在磁盘中,即使程序关闭了,数据依然存在----文件
 * 
 * 序列化:将数据从内存存入磁盘,可以实现数据的持久化存储.
 * 逆序列化:将数据从磁盘传回内存.
 * 
 * 进行序列化的步骤:---以对象的序列化为实例讲解
 * 1.创建一个类
 * 2.使用对应的流将对象存入磁盘---序列化---ObjectOutputStream
 * 3.使用对应的流将数据从磁盘中取出放回内存---逆序列化-----ObjectInputStream
 * 4.关闭流
 * 
 * 注意:序列化流在工作时也要关联输入流和输出流
 * 
//创建类用于序列化
//类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
//可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
/*
 * 解释:
 * 一个类如果没有实现Serializable,进行序列化会报异常:NotSerializableException
 * 
 * 实现了Serializable接口的类可以达到的目的:
 * 1.可以进行序列化
 * 2.进行序列化的类的元素都必须支持序列化
 * 3.接口本身没有方法或字段,只是用来表示可序列化的语义
 * 
 * * 注意点:
 * 1. ClassNotFoundException:当前的类没有找到
 * 分析:将Person对象进行序列化之后,将Person类删除,再进行反序列化的时候出现了异常
 * 原因:反序列化在执行的时候依赖字节码文件,当类没有了,字节码文件无法创建,反序列化失败
 * 
 * 2.java.io.InvalidClassException  无效的类
 * 出现的原因:没有声明自己的serialVersionUID,而使用系统的.在进行反序列化的时候,类被改动了,系统认为现在的类
 * 已经不是原来的类了(在使用系统的id进行识别的时候,重写给Person设置了id),认为此类无效
 * 
 * 3.使用系统的serialVersionUID与自定义的ID的区别?
 * 使用系统的,序列化和反序列化,id不能手动设置,使用的是编译器默认生成的,一旦类发生了改动,id会重新赋值
 * 使用自定义的,序列化和反序列化,id不会发生改变,所以当反序列化的时候,即使对Person类进行了一些改动,也能继续反序列化
 * 
 * 4.总结序列化,反序列化工程的注意点:
 * a.合理使用序列化流和反序列化流,要与输入流与输出流配合使用
 * b.进行序列化的类一定要实现Serializable接口,只要实现了接口就可以序列化.包括集合,包装类等
 * c.进行序列化的类要保证当前类与内部的类都要实现Serializable接口
 * 
 */
public class Demo11 {
     public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    	 //序列化
    	 fun1();
		 //逆序列化
    	 fun2();
	}
     
     //序列化
     public static void fun1() throws FileNotFoundException, IOException{
    	 //创建序列化流并关联文件
 		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("temp4.txt"));
 		//实现序列化
 		//注意:序列化后得到的内容不能直接查看,要看必须经过逆序列化
 		objectOutputStream.writeObject(new Person("bingbing",20));
 		//关闭流
 		objectOutputStream.close();
     }
     //逆序列化
     public static void fun2() throws FileNotFoundException, IOException, ClassNotFoundException {
    	//创建逆序列化流并关联文件
  		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("temp4.txt"));
  		
  		//实现逆序列化--读
  		Object object = objectInputStream.readObject();
  		Person person = (Person)object;
  		System.out.println(person);
  		
  		//关闭流
  		objectInputStream.close();
	}
}
//创建一个类
//这个类的对象要想进行序列化必须实现Serializable接口.
//类通过实现Serializable接口启动序列化功能.未实现此接口的类无法实现序列化或逆序列化.
//如果没有实现Serializable,会报异常NoSerializableException
//注意点:可序列化的对象的内部的元素也要都支持序列化.
class Person implements Serializable{
/**
 * generated:由编译器自动生成的,后面加L表示long型数据
 * 
 *  */
	private static final long serialVersionUID = 9100147150931711124L;
	//	/**
//	 * default:默认的方式,可以由用户自己指定,默认值是1L
//	 */
//	private static final long serialVersionUID = 17489587495847L;
	String name;
	int age;
	//int height;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42741866/article/details/82857766