java中的序列化与反序列化

序列化就是将一个对象以及他的属性写入一个文件,保存在存中对象的状态

反序列化就是把保存的对象状态再读出来

实现序列化与反序列化就要使用到IO操作中文件的字节流输入与输出

inputStream与outputStream对字节流操作inputStreamReader与outputStreamWrite为字符流操作

input与output是对于java内存而言的           input输入是由外部----->内存               output输出是内存---->外部

任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象,我们可以用read()方法将其取出

任何有能力接收数据源(流)的javaio对象我们就可以看作是一个OutputStream对象,可以用write()方法接受

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的,Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以

字节流与字符流:http://blog.csdn.net/zxman660/article/details/7875799
序列化分三步

1.创建FileOutputStream 对象,file是一个File类的对象

  File file = new File("D:\\person.per");括号内表示生成文件的存储路径

FileOutputStream  fout = new FileOutputStream(file);

2.创建ObjectOutputStream 对象

ObjectOutputStream oos = null;
oos = new ObjectOutputStream(fout);

3.将对象写入

p是一个实例化的对象Person p = new Person("aaa",12);

oos.writeObject(p);

最后就得关闭输出流,节省资源

oos.close();
fout.close();

反序列化也分三步,与序列化对应

1.

1.新建FileInputStream 对象,读取文件

FileInputStream fin = new FileInputStream(file);

2.新建ObjectInputStream 对象
ObjectInputStream oin;
oin = new ObjectInputStream(fin);

3.读取文件并恢复为对象
Person per1 = (Person) oin.readObject();
fin.close();
oin.close();

public class Javaxuliehua {
	public static void main(String[] args) {
		
		
		//File file = new File("D:"+File.separator+"person.per");
		File file = new File("D:\\person.per");
		/**
		 * 序列化过程
		 */
		Person p = new Person("aaa",12);
		try {
			FileOutputStream fout = new FileOutputStream(file);
			ObjectOutputStream oos = null;
			oos = new ObjectOutputStream(fout);
			oos.writeObject(p);
			oos.close();
			fout.close();
		/**
		 * 反序列化过程
		 */
			FileInputStream fin = new FileInputStream(file);
			ObjectInputStream oin;
			oin = new ObjectInputStream(fin);
			Person per1 = (Person) oin.readObject();
			System.out.println(per1);
			fin.close();
			oin.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

class Person implements Serializable{
	private String name;
	private int age;
	public Person(String name, int age) {
		this.name = name;
		this.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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}


posted @ 2018-01-08 10:36  非我非非我  阅读(404)  评论(0编辑  收藏  举报