对象流
- ObjectOutputStream(序列化) & ObjectInputStream(反序列化)
- 增强了缓冲区功能。
- 增强了读写8种基本数据类型和字符串的功能。
- 增强了读写对象的功能。
- readObject() 从流中读取一个对象。
- writeObject() 向流中写入一个对象。
- 使用流传输对象的过程称之为序列化和反序列化。
ObjectOutputStream(序列化)
- 将一个对象写入硬盘。
代码示例
先创建一个对象 序列化的对象需要实现Serializable
接口
import java.io.Serializable;
public class Student implements Serializable { //实现Serializable接口
public static final long serialVersionUID = 100;
private String name;
private int age;
private transient String country;//使用transient(瞬间)修饰的属性不能被序列化
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name:"+ this.name +"\t"+"age:"+this.age;
}
}
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class TestObjectOutputStream {
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("D:\\JavaCode\\JavaSE\\stu.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student stu1 = new Student("张三",18);
oos.writeObject(stu1);
oos.close();
}
}
注意事项
- 创建的bin文件只是一个类型,用txt打开会发现是乱码,因为他是一个对象。
ObjectInputStream(反序列化)
- 从流中读取对象。
代码示例
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class TestObjectInputStream {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("D:\\JavaCode\\JavaSE\\stu.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu2 = (Student) ois.readObject();//返回的是一个Object类型 高到低 强制转换为Student类
ois.close();
System.out.println(stu2.toString());
}
}
name:张三 age:18
Process finished with exit code 0
序列化与反序列化的注意事项
- 序列化类必须实现
Serializable
接口。 - 序列化类中的对象属性也要求实现
Serializable
接口。 public static final long serialVersionUID = ***L
,序列化版本号ID,保证序列化的类和反序列化的类是同一个类。- 使用
transient
(瞬间)修饰的属性不能被序列化。 - 静态属性不能被序列化。
- 序列化多个对象,可以借助集合实现。