Java IO流 序列化流 ObjectOutputStream ObjectInputStream

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;
}

  1. 实体类要实现Serializable接口才能序列化
  2. 先序列化Student到文件中,之后我们修改Student类,因为修改了Student类,所以再反序列化就会不匹配而报错,所以添加private static final long serialVersionUID = 5683452591122899119L;作为序列号,再反序列化时就不会报错
  3. 当我们不想序列化对象中的某个属性时,就可以添加transient关键字,当前属性就不会序列化到本地文件中了,如Student类中private transient int age;

自动生成序列化号

如下图所示设置IDEA

在这里插入图片描述

设置完毕之后,鼠标悬停在类名上,点击Add ‘serialVersionUID’ field就可以生成序列化号了,避免了自己瞎写而重复的可能
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值