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

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

实现序列化与反序列化就要使用到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字符,而字符流就可以

序列化分三步

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 + "]";
}
}