Java IO流 打印流 PrintStream PrintWriter
Java IO流 序列化流 ObjectOutputStream ObjectInputStream
Java IO流 缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
Java IO流 字符流 目录拷贝
Java IO流 字符流 FileWriter
Java IO流 字符流 FileReader
Java IO流 字节流 FileInputStream
Java IO流 字节流 FileOutputStream
创建对象
创建对象传入一个基本流,因为序列化是在基本流上做的封装
String filePath = "src/main/java/a.txt";
// 序列化输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
// 序列化输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
读写操作
序列化流读写操作与基本流相同,其中较为实用的就是writeObject与readObject,提供一个案例👇
public class ObjectStream {public static void main(String[] args) throws IOException, ClassNotFoundException {String filePath = "D:\\学习资料\\day01-SpringCloud01\\资料\\cloud-demo\\io\\src/main/java/a.txt";testObjectOutputStream(filePath);testObjectInputStream(filePath);}// 序列化对象public static void testObjectOutputStream(String filePath) throws IOException {Student student = new Student("zdy", 18);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));oos.writeObject(student);oos.close();}// 反序列化对象public static void testObjectInputStream(String filePath) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));Student object = (Student)ois.readObject();System.out.println(object); // Student(name=zdy, age=18)ois.close();}
}
细节处理
先来看看被序列化的类Student👇
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {private static final long serialVersionUID = 5683452591122899119L;private String name;private transient int age;private String address;
}
- 实体类要实现Serializable接口才能序列化
- 先序列化Student到文件中,之后我们修改Student类,因为修改了Student类,所以再反序列化就会不匹配而报错,所以添加private static final long serialVersionUID = 5683452591122899119L;作为序列号,再反序列化时就不会报错
- 当我们不想序列化对象中的某个属性时,就可以添加transient关键字,当前属性就不会序列化到本地文件中了,如Student类中private transient int age;
自动生成序列化号
如下图所示设置IDEA
设置完毕之后,鼠标悬停在类名上,点击Add ‘serialVersionUID’ field就可以生成序列化号了,避免了自己瞎写而重复的可能