对象流的作用
对象流用于存储和读取基本数据类型或对象的处理流。可以把Java中的对象写入数据源中,也能从数据源中还原对象。
序列化
序列化机制:
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
ObjectOutputStream
内存中的Java对象就是通过ObjectOutputStream保存到磁盘中或者通过网络传输出去
ObjectOutputStream的实现就是对对象进行序列化
下面展示为自定义Person类进行序列化
package com.ht.IO;
import java.io.Serializable;
public class Person implements Serializable {
private int id;
private String name;
public static final long serialVersionUID = 4653418741846L;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
自定义类序列化需要的条件
- 需要实现接口:Serializable
- 当前类需要提供一个全局常量:serialVersionUID
- 除了当前类需要实现Serializable接口,其中所有内部属性也必须是可序列化的
- ObjectOutputStream不能序列化static和transient修饰的成员变量
对象序列化写出实现
@Test
public void test4(){
ObjectOutputStream oos = null;
try {
//创建文件类对象
File file = new File("object.dat");
//创建节点流
FileOutputStream fis = new FileOutputStream(file);
//创建对象流
oos = new ObjectOutputStream(fis);
//将对象写入文件
oos.writeObject(new Person(1, "张三"));
oos.writeObject(new Person(2, "李四"));
oos.writeObject(new Person(3, "王五"));
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos != null){
//关闭流
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ObjectInputStream
前面的ObjectOutputStream是序列化过程,那么现在的ObjectInputStream就是反序列化过程了
代码实现
@Test
public void test5(){
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(new File("object.dat")));
Object p1 = ois.readObject();
Object p2 = ois.readObject();
System.out.println(p1);
System.out.println(p2);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}