序列化流与反序列化流
1.序列化流
-
Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
-
构造器
public ObjectOutputStream(OutputStream out):创建对象字节输出流,包装基础的字节流
-
方法
public final void writeObject(Object o) throws IOException:把对象写出去
-
注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable),否则报错(NotSerializableException)
2.反序列化流
-
将字节序列从文件中读取回来,重构对象,对它进行反序列化。也就是将存储在文件中的Java对象,读入到内存中来
-
构造器
public ObjectInputStream(InputStream is):创建对象字节输入流,包装基础的字节输入流
-
方法
public final Object readObject():把存储在文件中的Java对象读出来
-
反序列化流读取到文件末尾会抛异常EOFException(结束标记),可以循环读取,捕获到异常则结束循坏
package com.demo14_IO流_对象序列化流.demo01;
import java.io.*;
public class Demo01 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\Demo14.txt"));
oos.writeObject(new Student("玄德",30,"河北"));
oos.writeObject(new Student("云长",29,"运城"));
oos.writeObject(new Student("翼德",28,"河北"));
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\Demo14.txt"));
while (true){
try {
System.out.println(ois.readObject());
} catch (EOFException e) {
//如果捕获到这个异常,证明读到文件末尾
break;
}
}
ois.close();
}
}
class Student implements Serializable {
private String name;
private int age;
private String address;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3.如何一次序列化多个对象?
用一个ArrayList集合存储多个学生对象,直接对集合进行序列化即可,ArrayList集合已经实现了序列化接口
package com.demo14_IO流_对象序列化流.demo02;
import java.io.*;
import java.util.*;
public class Demo02 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\Demo16.txt"));
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("张三",18,"西安"));
list.add(new Student("李四",19,"北京"));
list.add(new Student("王五",29,"上海"));
oos.writeObject(list);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\Demo16.txt"));
ArrayList<Student> stus = (ArrayList<Student>) ois.readObject();
for (Student s : stus) {
System.out.println(s);
}
}
}
class Student implements Serializable {
private String name;
private int age;
private transient String address;
private static final long serialVersionUID = 9527L;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
if (name != null ? !name.equals(student.name) : student.name != null) return false;
return address != null ? address.equals(student.address) : student.address == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
result = 31 * result + (address != null ? address.hashCode() : 0);
return result;
}
}